以下は、セス・ラッドのブログのファクトリーコンストラクターの使用法についてです ' ダート-'ファクトリー 'コンストラクター'の値を理解しようとしています 。
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言語でいわゆる「ファクトリパターン」を説明できる人はいますか?
ファクトリパターンは同じです。これは一般的なパターンであり、言語固有ではありません。
Dartは、ファクトリパターンをサポートするファクトリコンストラクタを提供します。ファクトリコンストラクタは値(オブジェクト)を返すことができます。最初の例では、返すキーのインスタンスがあるかどうかを確認します。
2番目の例では、マップのキーをチェックせず、インスタンスを返しません。そのため、2つのインスタンスは同一ではありません。
よろしく、ロバート