当前位置: 首页 > 知识库问答 >
问题:

Dart-试图理解“工厂”构造函数的值

郜修雅
2023-03-14

如果我理解正确:

"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类设计的接口吗?

共有3个答案

谢唯
2023-03-14

工厂构造函数的一个特点是对象在方法开始时尚未创建。在该方法中,您可以使用各种机制来创建对象,例如:

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();
  }
}
酆意智
2023-03-14
匿名用户

我会将<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的构造函数一样使用它。这就是工厂构造函数。想到的第一个用例通常是单例模式的实现或缓存目的,但也包括所有其他情况,它寻找类的用户,好像他只是创建了一个新的实例,但实际上他以更复杂的方式构造和准备了一些东西,但他不需要知道。

赏成益
2023-03-14

我不认为工厂中的问题。

您的代码最初是错误的。

看看这个代码,并得出结论。

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语言与其他编程语言相比时,你可能会听到一些令人困惑东西,其中之一是工厂函数和构造函数。 工厂函数 所谓工厂函数,就是指这些内建函数都是类对象,当你调用他们时,实际上是创建了一个类实例”。意思就是当我调用这个函