在OOP中,我们会使用类来定义一类对象的属性,和行为。通过调用该类的构造函数来创建类的实例对象。在通过调用方法来实现操作行为。
和大多数OOP
语言一样,dart
的构造函数,采用和类同名的函数名作为构造函数,不显示声明构造函数会自动创建无参构造,构造函数不会被继承。此处不在赘述。关于dart
特有的 命名构造函数稍微说明一下。
开发中,我们通常会Map
和 Json
互转的场景,关于构造函数我们使用下面例子
import 'dart:convert';
class Token {
final String token_type;
final int expires_in;
final String access_token;
// final String? refresh_token;
Token.fromJson(Map<String, dynamic> json)
: token_type = json['token_type'],
expires_in = json['expires_in'],
access_token = json['access_token']
// refresh_token = json.containsKey('refresh_token') ? json['refresh_token'] as String : ''
;
Map<String, dynamic> toJson() => {
'token_type': token_type,
'expires_in': expires_in,
'access_token': access_token,
// 'refresh_token': refresh_token,
};
}
使用factory
修饰构造函数的时候,并不总是创建该类的实例对象。构造函数会从缓存返回一个实例。
class Logger {
final String name;
bool mute = false;
// _cache is library-private, thanks to
// the _ in front of its name.
static final Map<String, Logger> _cache = <String, Logger>{};
factory Logger(String name) {
return _cache.putIfAbsent(name, () => Logger._internal(name));
}
factory Logger.fromJson(Map<String, Object> json) {
return Logger(json['name'].toString());
}
Logger._internal(this.name);
void log(String msg) {
if (!mute) print(msg);
}
}
Map
用于cache
logger 实例对象。factory
构造函数即为设计模式中的工厂
模式factory
构造函数创建的实例和单例差不多class Logger {
factory Logger.create(ELogType type) {
if (type == ELogType.info) {
return Logger._infoLog();
}
if (type == ELogType.error) {
return Logger._errorLog();
}
if (type == ELogType.warning) {
return Logger._warningLog();
}
return Logger._infoLog();
}
Logger._infoLog() : displayColor = ELogType.info.logColor;
Logger._errorLog() : displayColor = ELogType.error.logColor;
Logger._warningLog() : displayColor = ELogType.warning.logColor;
String displayColor;
}
enum ELogType {
info(color: "white"),
warning(color: "yellow"),
error(color: "red");
const ELogType({required this.color});
final String color;
String get logColor => color;
}
TODO: 关于业务场景的实例拓展,