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

19

在Dart中,工厂构造函数需要更多的逻辑处理,但与const构造函数并没有太大区别,除了它们允许使用“非final”实例变量。

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

感谢大家。

编辑

以下内容是关于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'}
}

如上所示,虽然两个实例a和b是不同的对象,但效果都相同,如打印输出“print(Symbol.cache); //{something: Instance of 'Symbol'}”,因为映射对象只允许使用相同的字符串作为其键。

那么,我的问题是工厂构造函数(或工厂模式)与普通/常量构造函数相比有什么特殊优点?因为以上示例代码仅显示工厂构造函数没有任何优点。

有人能解释一下在Dart语言中所谓的“工厂模式”吗?而不是Java/C#。


2
我觉得这个例子完全没有体现符号类的重点,即如果使用相同的构造函数,则检索相同的实例。 - Domino
1个回答

28
一个工厂构造函数和一个常量构造函数具有完全不同的目的。常量构造函数允许在编译时常量表达式中拥有自定义类的实例。有关常量构造函数的更多详细信息,请参见https://dev59.com/C2Ei5IYBdhLWcg3wCYKY#21746692
工厂构造函数和返回类的新实例的常量方法更相似。不同之处在于,工厂构造函数像普通构造函数一样使用new进行调用,并且具有某些常量方法没有的限制。
普通构造函数和工厂构造函数之间的主要区别在于,您可以影响是否实际上创建了一个新实例以及它是什么具体类型。
https://www.dartlang.org/dart-tips/dart-tips-ep-11.html中提到了缓存作为一个流行的例子。工厂构造函数可以检查其内部缓存中是否有准备好的可重复使用实例,并返回此实例,否则创建一个新实例。

另一个例子是单例模式。请参见https://dev59.com/qGcs5IYBdhLWcg3wrmDC#12649574以获取更多详细信息。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接