Dart 工厂构造函数 - 它与“const”构造函数有何不同

Posted

技术标签:

【中文标题】Dart 工厂构造函数 - 它与“const”构造函数有何不同【英文标题】:Dart factory constructor - how is it different to “const” constructor 【发布时间】:2014-11-03 13:57:12 【问题描述】:

在 Dart 中,工厂构造函数需要程序员提供更多逻辑,但与 const 构造函数没有太大区别,只是它们允许“非最终”实例变量。

与 const 构造函数相比,它们有什么优点?

谢谢大家。

已编辑

以下是 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和b这两个实例是不同的对象,但效果都和'print(Symbol.cache); //something: Instance of 'Symbol'' 作为地图对象只允许一个相同的字符串作为其键。

那么,我的问题是工厂构造函数(或工厂模式)相对于通用/常量构造函数有哪些特殊优点?因为上面的示例代码单独显示了工厂构造函数的优点。

谁能用 Dart 语言而不是 Java/C# 解释什么是所谓的“工厂模式”?

【问题讨论】:

感觉这个例子完全漏掉了符号类的重点,就是用同一个构造函数检索同一个实例。 【参考方案1】:

工厂构造函数和 const 构造函数实现完全不同的目的。 const 构造函数允许在编译时常量表达式中拥有自定义类的实例。有关 const 构造函数的更多详细信息,请参阅https://***.com/a/21746692/217408。

工厂构造函数和返回类的新实例的常量方法更相似。不同之处在于,工厂构造函数像普通构造函数一样使用new 调用,并且有一些常量方法没有的限制。

普通构造函数和工厂构造函数的主要区别在于,你可以影响是否真的创建了一个新实例以及它是什么具体类型。

在https://www.dartlang.org/dart-tips/dart-tips-ep-11.html 中提到了一个缓存作为一个流行的例子。工厂构造函数可以检查它是否在内部缓存中有准备好的可重用实例并返回此实例或创建一个新实例。

另一个例子是单例模式。详情请见https://***.com/a/12649574/217408。

另一个例子是工厂模式。 例如,您可以拥有一个带有工厂构造函数的抽象类 A(无法实例化),该构造函数返回 A 的具体子类的实例,具体取决于传递给工厂构造函数的参数。

这是一个类似的问题Dart - Trying to understand the value of 'factory' constructor

【讨论】:

以上是关于Dart 工厂构造函数 - 它与“const”构造函数有何不同的主要内容,如果未能解决你的问题,请参考以下文章

Dart中的构造函数

const 构造函数实际上是如何工作的?

如何使用工厂构造函数创建对象?

FlutterDart的工厂构造方法&单例对象&初始化列表

Dart中的类和单例模式

Dart 2 中的 const 何时是可选的?