質問: new BProducerFactory().createProducer() } } ``` このようにFactory Methodパターンはクライアントと具象クラスが密結合になってしまうデメリットがあると考えます。 オブジェクトの生成処理においてテンプレートメソッドを利用する場合は意味があるとは思いますが、 それ以外の場合に敢えてFactory Methodを用意するメリットはありますでしょうか? むしろオブジェクトの生成処理は1ファクトリクラスに集約したほうが、疎結合なつくりにできるのではないかと考えています。 ご意見頂けますと幸いです。 参考 http://think-on-object.blogspot.jp/2011/11/factoryfactory-methodabstract-factory.html http://d.hatena.ne.jp/asakichy/20090414/1239718537 http://d.hatena.ne.jp/asakichy/20090331/1238472501 http://www.nulab.co.jp/designPatterns/designPatterns2/designPatterns2-2.html
回答: 結論 == Factory Methodパターンはインターフェースに依存した作りにすることで、 よりメリットを享受できるようになります。 内容 == サンプルのソースコードを確認いたしましたところ、 実クラスごとにFactoryクラスを作ってしまっており、メリットが「依存性の委譲」のみになってしまっているように見えました。 ``` interface Producer { // いくつかのメソッド } class AProducer implements Producer { // Producerの実装 } class BProducer implements Producer { // Producerの実装 } // ファクトリ class ProducerFactory() { public Producer createProducer( String type ) { if ( "A".equals( type ) ) { // Aが指定されたのでAProducerを生成 return new AProducer(); } if ( "B".equals( type ) ) { // Bが指定されたのでBProducerを生成 return new BProducer(); } // 何らかのエラー処理 } } // クライアント class Main() { public static void main(String[] args) { ProducerFactory producerFactory = new ProducerFactory(); // 中身はAProducer Producer ap = producerFactory.createProducer("A"); // 中身はBProducer Producer bp = producerFactory.createProducer("B"); } } ``` このようにFactoryクラスをインターフェースに依存するように作成し、 引数で指定できるようにゆとりを持たせると、 新しくCproducerが必要になった際に、ProducerFactoryクラスの改修のみですみます。 また、Mainから見た際に、引数のみ知っていれば、実クラスのことを全く知らなくても、 オブジェクトを生成することができます。 追記 == また、JavaであればSpringBootなどのフレームワークを使用することで、コンストラクタインジェクションや、DIでFactoryクラスの生成処理を他に委譲しさらに抽象度を高めることもできます。