推荐答案
在 Dart 中,工厂构造函数(factory constructor)是一种特殊的构造函数,它并不总是创建类的新实例。工厂构造函数可以返回缓存中的实例、子类的实例,或者根据条件返回不同的对象。工厂构造函数通常用于实现单例模式、延迟初始化或返回子类实例。
// www.javascriptcn.com code example
class Logger {
static final Map<String, Logger> _cache = <String, Logger>{};
final String name;
// 私有构造函数
Logger._internal(this.name);
// 工厂构造函数
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name]!;
} else {
final logger = Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
void log(String message) {
print('$name: $message');
}
}
void main() {
var logger1 = Logger('UI');
var logger2 = Logger('UI');
print(logger1 == logger2); // 输出: true
}本题详细解读
工厂构造函数的特点
- 不总是创建新实例:与普通构造函数不同,工厂构造函数可以返回一个已经存在的实例,而不是每次都创建一个新的实例。
- 可以返回子类实例:工厂构造函数可以返回当前类的子类实例,这在某些设计模式中非常有用。
- 可以用于延迟初始化:工厂构造函数可以用于延迟初始化对象,直到真正需要时才创建实例。
工厂构造函数的语法
工厂构造函数的语法与普通构造函数类似,但在声明时需要使用 factory 关键字:
factory ClassName(parameters) {
// 返回一个实例
}工厂构造函数的常见用途
- 单例模式:通过工厂构造函数可以轻松实现单例模式,确保一个类只有一个实例。
- 缓存实例:工厂构造函数可以用于缓存实例,避免重复创建相同的对象。
- 返回子类实例:工厂构造函数可以根据条件返回不同的子类实例,这在多态设计中非常有用。
示例代码解析
在示例代码中,Logger 类使用工厂构造函数来实现缓存功能。每次调用 Logger 的工厂构造函数时,它会检查缓存中是否已经存在相同名称的 Logger 实例。如果存在,则返回缓存中的实例;如果不存在,则创建一个新的实例并将其存入缓存中。
// www.javascriptcn.com code example
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name]!;
} else {
final logger = Logger._internal(name);
_cache[name] = logger;
return logger;
}
}通过这种方式,Logger 类确保了相同名称的日志器只会有一个实例,从而节省了资源并避免了重复创建对象。