web-dev-qa-db-ja.com

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
}

IMHOは、一般的なコンストラクターを使用すると、微妙な違いで同じ効果を実現できますが、非常に簡単です。

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'}
}

上に示したように、2つのインスタンスaとbは異なるオブジェクトですが、効果はすべて 'print(Symbol.cache);に示されているものと同じです。 // {something:マップオブジェクトとしての 'Symbol'} 'のインスタンスは、そのキーと同じ文字列の1つのみを許可します。

だから、私の質問は、一般/定数コンストラクターに対するファクトリコンストラクター(またはファクトリパターン)の特有のメリットは何ですか?上記のサンプルコードだけでは、ファクトリコンストラクタのメリットがないためです。

Java/C#ではなくDart言語でいわゆる「ファクトリパターン」を説明できる人はいますか?

9
Letsgo

ファクトリパターンは同じです。これは一般的なパターンであり、言語固有ではありません。

Dartは、ファクトリパターンをサポートするファクトリコンストラクタを提供します。ファクトリコンストラクタは値(オブジェクト)を返すことができます。最初の例では、返すキーのインスタンスがあるかどうかを確認します。

2番目の例では、マップのキーをチェックせず、インスタンスを返しません。そのため、2つのインスタンスは同一ではありません。

よろしく、ロバート

11
Robert