【发布时间】:2014-11-03 13:57:12
【问题描述】:
在 Dart 中,工厂构造函数需要程序员提供更多逻辑,但与 const 构造函数没有太大区别,只是它们允许“非最终”实例变量。
与 const 构造函数相比,它们有什么优点?
谢谢大家。
已编辑
以下是 Seth Ladd 的博客“Dart - Trying to understand the value of 'factory' constructor”中关于工厂构造函数的用法。
class Symbol {
final String name;
static Map<String, Symbol> _cache = new Map<String, Symbol>();
factory Symbol(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final symbol = new Symbol._internal(name);
_cache[name] = symbol;
return symbol;
}
}
Symbol._internal(this.name);
}
main() {
var x = new Symbol('X');
var alsoX = new Symbol('X');
print(identical(x, alsoX)); // true
}
恕我直言,使用通用构造函数,可以实现相同的效果,但略有不同,但相当简单。
class Symbol {
static final Map<String, Symbol> cache = {};
final String name;
Symbol(name) {
cache[name] = new Symbol._internal();
}
Symbol._internal();
}
main(){
var a = new Symbol('something');
var b = new Symbol('something');
print(identical(a, b)); // false!
print(Symbol.cache); //{something: Instance of 'Symbol'}
}
如上图,虽然a和b这两个实例是不同的对象,但效果都和'print(Symbol.cache); //{something: Instance of 'Symbol'}' 作为地图对象只允许一个相同的字符串作为其键。
那么,我的问题是工厂构造函数(或工厂模式)相对于通用/常量构造函数有哪些特殊优点?因为上面的示例代码单独显示了工厂构造函数的优点。
谁能用 Dart 语言而不是 Java/C# 解释什么是所谓的“工厂模式”?
【问题讨论】:
-
感觉这个例子完全漏掉了符号类的重点,就是用同一个构造函数检索同一个实例。
标签: constructor dart factory