如果我理解正确:
"A factory constructor affords an abstract class to be
instantiated by another class, despite being abstract."
例如:
dart prettyprint-override">abstract class Animal {
String makeNoise(String sound);
String chooseColor(String color);
factory Animal() => new Cat();
}
class Cat implements Animal {
String makeNoise(String noise) => noise;
String chooseColor(color) => color;
}
以上允许我这样做:
Cat cat = new Animal();
var catSound = cat.makeNoise('Meow');
var catColor = cat.chooseColor('black');
print(catSound); // Meow
这也阻止了我这样做:
class Dog implements Animal {
int age;
String makeNoise(String noise) => noise;
String chooseColor(color) => color;
}
Dog dog = new Animal(); // <-- Not allowed because of the factory constructor
因此,如果我对所有这些都是正确的,我会问为什么动物的额外代码?
如果您打算为只创建cat的动物使用工厂构造函数,为什么不只是拥有一个具有所需方法/属性的Cat类呢?
或者,像上面这样带有工厂构造函数的动物类的目的真的是专为Cat类设计的接口吗?
工厂构造函数的一个特点是对象在方法开始时尚未创建。在该方法中,您可以使用各种机制来创建对象,例如:
abstract class Animal {
String makeNoise(String sound);
String chooseColor(String color);
factory Animal() {
var random = new math.Random();
if (random.nextBool() == true)
return new Cat();
else
return new Dog();
}
}
我会将<code>Cat<code>视为<code>Animal<code>的默认实现。
当然,你不能做 Dog dog = new Animal();
因为 new Animal();
返回一只 Cat
,但你可以 do Dog dog = new Dog();
or Animal animal = new Dog();
这只是你如何利用工厂构造函数的另一个例子。尝试将工厂构造函数视为返回对象的普通函数(顶级函数或静态类函数)。为了让类的用户不知道幕后发生了什么,允许他像使用< code>new SomeClass的构造函数一样使用它。这就是工厂构造函数。想到的第一个用例通常是单例模式的实现或缓存目的,但也包括所有其他情况,它寻找类的用户,好像他只是创建了一个新的实例,但实际上他以更复杂的方式构造和准备了一些东西,但他不需要知道。
我不认为工厂中的问题。
您的代码最初是错误的。
看看这个代码,并得出结论。
Locomotive locomotive = new SomethingWithSmokeFromChimney();
现在看看这段代码。
Plant plant = new SomethingWithSmokeFromChimney();
你错误地认为地球上的所有动物(甚至狗)都是猫。
Cat cat = new Animal();
如果你想要这个。
Cat cat = new Animal();
Dog dog = new Animal();
那么(如果我正确理解你的话)你也想要这个。
// Cat cat = new Animal();
// Dog dog = new Animal();
Dog dog = new Cat();
附笔。
同样的错误结论,但没有
工厂
。
void main() {
Cat cat = new Animal();
Dog dog = new Animal();
}
class Animal {
}
class Cat implements Animal {
}
class Dog implements Animal {
}
但是这个代码(取决于文档)可能被认为是正确的。
void main() {
Cat cat = new Animal("cat");
Dog dog = new Animal("dog");
}
abstract class Animal {
factory Animal(String type) {
switch(type) {
case "cat":
return new Cat();
case "dog":
return new Dog();
default:
throw "The '$type' is not an animal";
}
}
}
class Cat implements Animal {
}
class Dog implements Animal {
}
抽象类的工厂构造函数可以返回(默认情况下)此抽象类的一些默认实现。
abstract class Future<T> {
factory Future(computation()) {
_Future result = new _Future<T>();
Timer.run(() {
try {
result._complete(computation());
} catch (e, s) {
result._completeError(e, s);
}
});
return result;
}
}
关于这里提到的工厂构造函数示例,我有一些小问题(https://www.dartlang.org/guides/language/language-tour#factory-constructors)。我知道在基本层面上只有三种类型的构造函数 - 默认,命名和参数化。 在本例中,为什么要使用<code>工厂 这是正在使用的命名构造函数吗?为什么
在Dart中,工厂构造函数需要编码器提供更多逻辑,但与常量构造函数没有太大区别,只是它们允许“非最终”实例变量。 与const Constructor相比,它们有哪些优点? 谢谢大家。 编辑 下面是关于Seth Ladd博客“Dart-试图理解“工厂”构造函数的价值”中工厂构造函数的用法。 恕我直言,使用通用构造函数,可以通过细微的差异实现相同的效果,但相当简单。 如上所示,尽管这两个实例 所以,
下面是关于Seth Ladd博客“Dart”中工厂构造器的使用-试图理解“工厂”构造器值。 在IMHO中,使用通用构造器,可以通过细微的差异实现相同的效果,但非常简单。 如上所示,尽管这两个实例 所以,我的问题是工厂构造函数(或工厂模式)比一般/const构造函数有什么特殊的优点?因为上面的示例代码本身并没有显示工厂构造函数的优点。 谁能解释一下在Dart语言而不是Java / C#中所谓的“工厂
问题内容: 有人可以澄清Javascript中的构造函数和工厂函数之间的区别。 何时使用一个代替另一个? 问题答案: 基本区别在于,构造函数与关键字一起使用(这会使JavaScript自动创建一个新对象,在该函数内将该对象设置为该对象,然后返回该对象): 工厂函数的调用类似于“常规”函数: 但是要使其成为“工厂”,就需要返回某个对象的新实例:如果它仅返回布尔值或其他内容,则不会将其称为“工厂”函数
本文向大家介绍dart 构造函数,包括了dart 构造函数的使用技巧和注意事项,需要的朋友参考一下 示例 类的构造函数必须与其类具有相同的名称。 让我们为Person类创建一个构造函数: 与下面的方法相比,上面的示例是一种定义构造函数的更简单,更好的方法: 现在,您可以创建一个Person实例,如下所示:
本文向大家介绍JavaScript中工厂函数与构造函数示例详解,包括了JavaScript中工厂函数与构造函数示例详解的使用技巧和注意事项,需要的朋友参考一下 前言 当谈到JavaScript语言与其他编程语言相比时,你可能会听到一些令人困惑东西,其中之一是工厂函数和构造函数。 工厂函数 所谓工厂函数,就是指这些内建函数都是类对象,当你调用他们时,实际上是创建了一个类实例”。意思就是当我调用这个函