以下是关于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&amp; b,是不同的对象,效果与'print(Symbol.cache)中显示的效果完全相同; // {something:'Symbol'的实例}作为地图对象,只允许其中一个字符串作为其键。
所以,我的问题是工厂构造函数(或工厂模式)对一般/ const构造函数的特殊优点是什么?因为上面的示例代码没有显示工厂构造函数的优点。
有人能解释Dart语言中所谓的“工厂模式”而不是Java / C#吗?
答案 0 :(得分:8)
工厂PATTERN是一样的。它是一般模式,不是语言特定的。
Dart提供工厂构造函数来支持工厂模式。工厂构造函数能够返回值(对象)。在第一个示例中,检查是否存在您返回密钥的实例。
在第二个示例中,您不会检查地图的键,也不会返回实例。这就是为什么这两个实例不相同的原因。
此致 罗伯特