关于Dart的工厂建设者

时间:2014-09-12 00:18:18

标签: constructor dart factory-pattern

以下是关于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&amp; b,是不同的对象,效果与'print(Symbol.cache)中显示的效果完全相同; // {something:'Symbol'的实例}作为地图对象,只允许其中一个字符串作为其键。

所以,我的问题是工厂构造函数(或工厂模式)对一般/ const构造函数的特殊优点是什么?因为上面的示例代码没有显示工厂构造函数的优点。

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

1 个答案:

答案 0 :(得分:8)

工厂PATTERN是一样的。它是一般模式,不是语言特定的。

Dart提供工厂构造函数来支持工厂模式。工厂构造函数能够返回值(对象)。在第一个示例中,检查是否存在您返回密钥的实例。

在第二个示例中,您不会检查地图的键,也不会返回实例。这就是为什么这两个实例不相同的原因。

此致 罗伯特