公正な警告 - ずっと前に私はC++をたくさん書いていましたが、私が以前知っていたデザインパターンにjavascriptを強制する誘惑を助けることはできません。これは、工場出荷時のパターンを示して私の現在のプロジェクト、私は名前でオブジェクトを作成したい、ではどの回答;-)これは新しいjavascriptの工場パターンですか?
に先祖帰りの私を非難しても大丈夫です。だから私はGoogleのヒットのトップページを 'javascript factory pattern'のために読んだ。 2つの問題がある
if (name === 'FactoryPartA') {
parentClass = PartA;
} else if (name === 'FactoryPartB') {
parentClass = PartB;
} else if ...
parentClass = PartZ;
}
return new parentClass();
:彼らはすべて共通で、この醜い事持って
- 私が作る工場のために新しいパーツを作成するたびに、私は「工場の実装を編集することがあると私d両方の作業を避けることを好む。&バグ挿入の機会。
- これはハードコーディングされた線形検索で、「効率性」をほとんど叫ばないものです。工場の閉鎖
register
内の工場の部品のクラスを定義するの戦術が提供するモジュールパターンのメリットを隠す情報を持つモジュールと工場パターンの組み合わせ -
は、だからここに私が思い付いたものです。
最終的に私の質問に:私はこれまでに私よりも優れたコーダーによって行われたとは思えませんので、もしあなたが知っていれば工場のパターンでこのツイストの標準バージョンへのリンクを共有してください。
N.B.この例では、すべてのコードを一緒に実行しています。私のプロジェクトでは、Factory、FactoryPartA、FactoryPartB、およびクライアントコードはすべて別々のファイルにあります。
namespace('mynamespace');
// object factory
mynamespace.factory = (function() {
'use strict';
var api = {};
var registry = [];
// register an item
api.register = function (item) {
if (registry.some (function (r) {return r.name === item.name;})) {
throw new Error ('factory.register(): name collision detected: ' + name);
} else {
registry.push(item);
}
};
// make an item given its name
api.make = function (name) {
var item = null;
var idx = registry.findIndex (function (r) {
return r.name === name;
});
if (idx >= 0) {
item = new registry[idx].make();
}
return item;
};
return api;
})();
// define a module & register it with factory
mynamespace.factory.register ({
name: 'FactoryPartA',
make: function FactoryPartA() {
'use strict';
var label = 'Factory Part A'; // private property
this.test = undefined; // public property
this.label = function() { // public method
return label;
};
return this;
}
});
// define a different module & register it with factory
mynamespace.factory.register ({
name: 'FactoryPartB',
make: function FactoryPartB() {
'use strict';
var label = 'Factory Part B';
this.test = undefined;
this.label = function() {
return label;
};
return this;
}
});
// client code
var aPart = mynamespace.factory.make('FactoryPartA');
var bPart = mynamespace.factory.make('FactoryPartB');
console.log (aPart.label()); // logs 'Factory Part A'
console.log (bPart.label()); // logs 'Factory Part B'
var anotherPart = mynamespace.factory.make('FactoryPartA');
aPart.test = 'this one is not';
anotherPart.test = 'the same as this one';
console.log (aPart.test !== anotherPart.test); // logs true
ダイナミック工場のリンクのこの種のは、まさに問題の依存性の注入は、([自分のライブラリへの恥知らずのリンク](https://github.com/ssube/noicejs))を解決するために作成しました。 – ssube