在OOP中,我们会使用类来定义一类对象的属性,和行为。通过调用该类的构造函数来创建类的实例对象。在通过调用方法来实现操作行为。
1、构造函数
和大多数OOP
语言一样,dart
的构造函数,采用和类同名的函数名作为构造函数,不显示声明构造函数会自动创建无参构造,构造函数不会被继承。此处不在赘述。关于dart
特有的 命名构造函数稍微说明一下。
1.1 命名构造函数
开发中,我们通常会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,
};
}
2 factory constructor
2.1 官方文档
使用factory
修饰构造函数的时候,并不总是创建该类的实例对象。构造函数会从缓存返回一个实例。
2.1 官方例子
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 实例对象。 - 该类主要用于打印包含字符和Map(包含name属性的Map)log信息。
-
name字符变量改变也会创建新的Logger对象 -
打印只包含name的map对象,真的是妙啊!!!!!!!!
2.3 jeverson 关于工厂构造的理解
-
factory
构造函数即为设计模式中的工厂
模式 -
factory
构造函数创建的实例和单例差不多
2.3.1 关于Logger的改造
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;
}
- 基于简单工厂实现的一个Logger案例,当然现实中的Logger 在info,error,warning 的细数逻辑,并不是简单的赋值。
- 关于抽象工厂的实现方式,本例不展开扩展,改造近提供设计的思路。
2.3.2 关于工厂构造在Flutter 的使用场景
- 基础框架中的,日志收集以及需要采用单例模式
- C端差异化源组件设计化的差异,Alert,Toast,HUD等
- 通用业务的抽离。
TODO: 关于业务场景的实例拓展,