constructor - Dart Factory构造函数-与 “const”构造函数有何不同

标签 constructor dart factory

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

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

谢谢你们。

编辑

以下是塞思·拉德(Seth Ladd)博客“Dart-试图理解“工厂”构造函数的值(value)”中工厂构造函数的用法。

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:'Symbol'}'的实例作为 map 对象,只允许将相同的字符串之一用作其键。

因此,我的问题是工厂构造函数(或工厂模式)相对于通用/ const构造函数的独特优点是什么?因为仅上述示例代码没有显示工厂构造函数的优点。

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

最佳答案

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

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

普通构造函数和工厂构造函数之间的主要区别在于,您可以影响是否实际创建了新实例以及具体实例的类型。

https://www.dartlang.org/dart-tips/dart-tips-ep-11.html中,提到了一个缓存作为流行示例。工厂构造函数可以检查内部缓存中是否具有准备好的可重用实例,然后返回该实例或以其他方式创建一个新实例。

另一个例子是单例模式。有关更多详细信息,请参见https://stackoverflow.com/a/12649574/217408

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

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

关于constructor - Dart Factory构造函数-与 “const”构造函数有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25756593/

相关文章:

swift - Flutter 网络未连接到 FirebaseAuth 服务

regex - 如何在 Dart 中替换字符串中间的空格?

hibernate - 多模块项目 spring 3.0 AnnotationSessionFactoryBean packagesToScan 属性值按模块设置

constructor - Java:为什么 "Character newChar = ' c' "work if Character is a wrapper class? How come it doesn' t 需要构造函数?

C++“不存在合适的构造函数来从<默认构造函数>转换为参数化构造函数

C++ 奇怪的构造函数行为

http - HTTP 请求未在响应中执行 - Flutter/Dart

C# 如何将对象列表传递给构造函数?

C++ 类不识别字符串数据类型

javascript - 使用依赖注入(inject)时,通过引用调用服务或直接调用服务有区别吗?