在Dart中,工厂建设者需要更多来自编码人员的逻辑,但与常数编辑人员没有太大差别,除非他们允许“非最终版本”。实例变量。
它们对const构造函数的优点是什么?
谢谢大家。
被修改
下面是关于Seth Ladd博客的工厂构造函数的使用情况'飞镖 - 试图了解工厂'构造'
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,是不同的对象,效果与&#39; print(Symbol.cache)中所示的相同; // {something:&#39; Symbol&#39;}&#39;作为地图对象,只允许其中一个字符串作为其键。
所以,我的问题是工厂构造函数(或工厂模式)对一般/ const构造函数的特殊优点是什么?因为上面的示例代码没有显示工厂构造函数的优点。
任何人都可以解释什么是所谓的工厂模式&#39;在Dart语言而不是Java / C#?
答案 0 :(得分:20)
工厂构造函数和const构造函数实现完全不同的目的。 const构造函数允许在编译时常量表达式中具有自定义类的实例。有关const构造函数的更多详细信息,请参阅https://stackoverflow.com/a/21746692/217408。
工厂构造函数和返回类的新实例的常量方法更相似。区别在于,工厂构造函数与new
一样使用普通构造函数进行调用,并且具有常量方法所没有的一些限制。
普通构造函数和工厂构造函数之间的主要区别在于,您可以影响实际创建新实例以及它的具体类型。
在https://www.dartlang.org/dart-tips/dart-tips-ep-11.html中,缓存被称为一个流行的例子。工厂构造函数可以检查它是否在内部缓存中具有已准备好的可重用实例,并返回此实例或以其他方式创建新实例。
另一个例子是单身人士模式。有关详细信息,请参阅https://stackoverflow.com/a/12649574/217408。
另一个例子是工厂模式。
例如,您可以使用工厂构造函数来创建一个抽象类A
(无法实例化),该构造函数返回A
的具体子类的实例,具体取决于传递给工厂构造函数的参数
以下是类似的问题Dart - Trying to understand the value of 'factory' constructor