Factory Method-インスタンス作成をサブクラスにまかせる-
Java言語で学ぶデザインパターン入門 の第4章を参考にしました。
Factory Methodパターンとは
本書には以下のように記載されています。
つまり、前回の記事のTemplate Methodパターンの処理の枠組みにおいて、 インスタンス生成を組み込んだものです。 'factory'は、日本語で'工場'という意味があります。 スーパークラスが'工場'の役割を果たし、そこからサブクラスが生成されるというイメージです。
Factory Methodパターンの登場人物
- Product(製品)役
- Creator(作成者)役
- フレームワーク側
- Product役を生成する抽象クラス
- ConcreteProduct(具体的製品)
- 具体的な製品を定める
- ConcreteCreator(具体的作成者)
- 具体的な製品を作るクラスを定める
実装
こちらを参考にしてください。
Factory Methodパターンを使う場合
大まかな処理は以下のような形になります。
Factory factory = new IDCardFactory(); Product card1 = factory.create("結城浩"); Product card2 = factory.create("とむら"); Product card3 = factory.create("佐藤花子"); card1.use(); card2.use(); card3.use();
Factory Methodパターンを使わない場合
これと同等の処理を素直にJavaで書くとこうなると思います。 この変更を行うには、IDCardコンストラクタをpublicに変更する必要があります。
Product card1 = new IDCard("結城浩"); Product card2 = new IDCard("とむら"); Product card3 = new IDCard("佐藤花子"); card1.use(); card2.use(); card3.use();
Factory Methodパターンを使うメリット
上の2つを見比べると「Factory Methodパターン使わない方が楽なんじゃね...」となるかもしれません。 確かにこの処理を動かすためだけには、Factory Methodパターンを使わない方が楽だと思います。 しかし、Factory Methodには、mainクラスを具体的なクラス名による束縛から解放する というメリットがあります。
Factory Methodパターンの特徴は、Mainクラスにおいて、new演算子によるインスタンス生成を行わずに メソッド呼び出しに置き換えていることです。 これにより、Mainクラスは具体的なクラス(IDCardクラス)を知らずともインスタンス生成をすることが可能となります。
まとめ
インスタンス生成役とインスタンスの中身の実装役に分けているのがFactory Methodパターン。
Solidityでスマートコントラクトの構築を学習できる、CryptoZombiesはこのデザインパターンを用いてますね。