デザインパターンの一つであるFactory Methodを調べていて気になった点を質問させてください。
Factoryパターンのメリット
Factory Methodに限らず、一般的にオブジェクトの生成のためのFactoryを設けることのメリットは以下の通りと認識しています。
・ インスタンスの生成処理を隠蔽化できる
・ そのためクライアントが利用したいオブジェクトの具象から分離される。(具象オブジェクトをnewしない)
java
1interface Producer { 2 // いくつかのメソッド 3} 4class AProducer implements Producer { 5 // Producerの実装 6} 7 8// ファクトリ 9class ProducerFactory() { 10 public Producer createProducer() { 11 return new AProducer(); 12 } 13} 14 15// クライアント 16class Main() { 17 public static void main(String[] args) { 18 Producer p = ProducerFactory.createProducer() 19 } 20}
Factory Methodパターン
Factory Methodパターンの場合、生成したいオブジェクトの種類に応じてファクトリを用意することになるので、
「クライアントが利用したいオブジェクトの具象から分離される。」メリットを完全に失っている気がします。
※実際に利用したいオブジェクトには依存してませんが、そのオブジェクトを生成するためのファクトリに依存している(newしている)ため。利用するオブジェクトが変われば当然ファクトリも変えざるを得ず、クライアントのコードに修正が発生します。
java
1interface Producer { 2 // いくつかのメソッド 3} 4class AProducer implements Producer { 5 // Producerの実装 6} 7 8class BProducer implements Producer { 9 // Producerの実装 10} 11 12// ファクトリ 13abstract class ProducerFactory { 14 public abstract Producer createProducer(); 15} 16class AProducerFactory extends ProducerFactory { 17 public Producer createProducer() { 18 return new AProducer(); 19 } 20} 21class BProducerFactory extends ProducerFactory { 22 public Producer createProducer() { 23 return new BProducer(); 24 } 25} 26 27// クライアント 28class Main() { 29 public static void main(String[] args) { 30 Producer ap = new AProducerFactory().createProducer() 31 Producer ap = new BProducerFactory().createProducer() 32 } 33}
このように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

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/31 11:10