Help us understand the problem. What is going on with this article?

知っておきたいデザインパターン 4.ファクトリパターン

More than 3 years have passed since last update.

こんにちは、@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さんです!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away