在Dart中,工厂构造函数需要编码器提供更多逻辑,但与常量构造函数没有太大区别,只是它们允许“非最终”实例变量。
与const Constructor相比,它们有哪些优点?
谢谢大家。
编辑
下面是关于Seth Ladd博客“Dart-试图理解“工厂”构造函数的价值”中工厂构造函数的用法。
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'}
}
如上所示,尽管这两个实例
所以,我的问题是,工厂构造函数(或工厂模式)比一般/常量构造函数有什么独特的优点?因为上面的示例代码本身并没有显示factory构造函数的优点。
有谁能用Dart语言而不是Java/C来解释所谓的“工厂模式”吗?
工厂构造函数和常量构造函数实现完全不同的目的。const构造函数允许在编译时常量表达式中包含自定义类的实例。看见https://stackoverflow.com/a/21746692/217408有关const构造函数的更多详细信息。
工厂构造函数和返回类的新实例的常量方法更相似。不同之处在于,工厂构造函数像普通构造函数一样使用new
调用,并且具有常量方法不具备的一些限制。
普通构造函数和工厂构造函数之间的主要区别在于,您可以影响是否实际创建了新实例以及它的具体类型。
在https://www.dartlang.org/dart-tips/dart-tips-ep-11.html缓存是一个常见的例子。工厂构造函数可以检查内部缓存中是否有准备好的可重用实例,并返回该实例或以其他方式创建一个新实例。
另一个例子是单例模式。看见https://stackoverflow.com/a/12649574/217408更多细节。
另一个例子是工厂模式。例如,您可以使用一个抽象类A
(无法实例化),该抽象类带有一个工厂构造函数,该工厂构造函数返回A
的具体子类的实例,具体取决于传递给工厂构造函数的参数。
这里有一个类似的问题Dart——试图理解“工厂”构造函数的价值
本文向大家介绍dart 构造函数,包括了dart 构造函数的使用技巧和注意事项,需要的朋友参考一下 示例 类的构造函数必须与其类具有相同的名称。 让我们为Person类创建一个构造函数: 与下面的方法相比,上面的示例是一种定义构造函数的更简单,更好的方法: 现在,您可以创建一个Person实例,如下所示:
下面是关于Seth Ladd博客“Dart”中工厂构造器的使用-试图理解“工厂”构造器值。 在IMHO中,使用通用构造器,可以通过细微的差异实现相同的效果,但非常简单。 如上所示,尽管这两个实例 所以,我的问题是工厂构造函数(或工厂模式)比一般/const构造函数有什么特殊的优点?因为上面的示例代码本身并没有显示工厂构造函数的优点。 谁能解释一下在Dart语言而不是Java / C#中所谓的“工厂
问题内容: 有人可以澄清Javascript中的构造函数和工厂函数之间的区别。 何时使用一个代替另一个? 问题答案: 基本区别在于,构造函数与关键字一起使用(这会使JavaScript自动创建一个新对象,在该函数内将该对象设置为该对象,然后返回该对象): 工厂函数的调用类似于“常规”函数: 但是要使其成为“工厂”,就需要返回某个对象的新实例:如果它仅返回布尔值或其他内容,则不会将其称为“工厂”函数
如果我理解正确: 例如: 以上允许我这样做: 这也阻止了我这样做: 因此,如果我对所有这些都是正确的,我会问为什么动物的额外代码? 如果您打算为只创建cat的动物使用工厂构造函数,为什么不只是拥有一个具有所需方法/属性的Cat类呢? 或者,像上面这样带有工厂构造函数的动物类的目的真的是专为Cat类设计的接口吗?
关于这里提到的工厂构造函数示例,我有一些小问题(https://www.dartlang.org/guides/language/language-tour#factory-constructors)。我知道在基本层面上只有三种类型的构造函数 - 默认,命名和参数化。 在本例中,为什么要使用<code>工厂 这是正在使用的命名构造函数吗?为什么
我注意到在Dart中可以创建一个const构造函数。在文档中,它说< code>const一词用于表示编译时常数。 我想知道当我使用构造函数创建对象时会发生什么。这是否像一个不可变对象,它总是相同的并且在编译时可用?构造函数的概念实际上是如何工作的?const构造函数与常规构造函数有何不同?