こんにちは、@Im0_3です。LIGアドベントカレンダーの16日目です!
デザインパターンの第4回です。
過去の記事はこちらからご覧ください。
知っておきたいデザインパターン 1.モジュールパターン
知っておきたいデザインパターン 2.ファサードパターン
知っておきたいデザインパターン 3.シングルトンパターン
今回はファクトリパターンについてです。
ファクトリパターンとは
Factoryとは工場という意味ですね。この工場はオブジェクトの作成をする工場です。
このパターンを使うことでオブジェクトの作成をシンプルにしてくれます。
そしてオブジェクトを作るときには、文字列を渡してそれに合わせたオブジェクトを返してくれます。
実践ファクトリパターン
今回はビール工場に例をファクトリパターンを実装してみます。
//[1] AleコンストラクタとLagerコンストラクタを定義
function Ale( option ) {
this.style = option.style || "Pale ale";
this.pint = option.pint || 50
}
function Lager( option ) {
this.style = option.style || "Pilsner";
this.pint = option.pint || 50
}
//インスタンス生成のためのコンストラクタ
function BeerFactory() {}
BeerFactory.prototype.beerClass = Ale;
//[2]beerTypeによって生成するインスタンスを決め、オブジェクトを返す。
BeerFactory.prototype.brewBeer = function( option ) {
if( option.beerType === 'ale' ) {
this.beerClass = Ale;
} else {
this.beerClass = Lager;
}
return new this.beerClass(option);
};
//BeerFactoryインスタンスを生成
var beerFactory = new BeerFactory();
//brewBeerメソッドでインスタンスを生成
var ale = beerFactory.brewBeer( {
beerType: 'ale'
});
console.log( ale instanceof Ale ); //console.log
console.log( ale ); //style:"Pale ale", pint:50
まずこの工場ではエールとラガーの2種類のビールを製造しています。そのため、Aleコンストラクタと、Lagerコンストラクタを用意しました。[1]
次に工場に発注書(option)を渡すとビールを製造して商品を送ってくれるようにします。
beerFactoryにbrewBeerというメソッドを作り、引数にオプションを渡します。オプションに書かれているbeerTypeによってどちらのビールを作るか判断して、新しいインスタンスが生成されます。[2]
ファクトリパターンのメリット
このようにファクトリメソッドを使うことで、オブジェクトの生成を一箇所にまとめることができるため管理、メンテナンスがしやすくなります。また内部の構造を意識せずに使用ができるため、オブジェクトやコンポーネントの設定がかなり複雑な場合や、状況に応じて異なる種類のオブジェクトのインスタンスを簡単に作成したい場合に役に立ちます。
明日は@zuyaさんです!