###ファクトリパターンについて
デザインパターンについて勉強していて、ファクトリパターンを実際に使おうと思って壁に当たったので質問しました。
###ファクトリパターンの例
よく見る例題は以下のような感じだと思います。
Java
1// ファクトリ 2class SimpleFactory{ 3 public static Product create(String id){ 4 Product product = null; 5 if("SPAM".equals(id)){ 6 return new Spam(); 7 } 8 else if("HAM".equals(id)){ 9 return new Ham(); 10 } 11 return null; 12 } 13}
Java
1// ファクトリの利用 2SimpleFactory factory = new SimpleFactory(); 3Product product = factory.create("HAM"); 4procudt.hoge(); 5
###問題点
上の例では、SpamクラスもHamクラスもhoge()というメソッドをオーバーライドすることで、それぞれのhoge()メソッドを利用できます。
しかしながら、もしSpamクラスではhoge(String, int)を、Hamクラスではhoge(int, List<Integer>)を利用したい場合は、どのように実装すれば効率的でしょうか。
解決案1
ファクトリパターンを諦め、idによって分岐させ、その分岐させた中でそれぞれのhogeメソッドを利用する。
Java
1if("SPAM".equals(id)){ 2 Product spam = new Spam(); 3 ((Spam)spam).hoge("java", 10); 4} 5else if("HAM".equals(id)){ 6 Product ham = new Ham(); 7 ((Ham)ham).hoge(5, new ArrayList<Integer>()); 8}
解決案2
Productにhoge(String, int)とhoge(int, List<Integer>)を宣言しておき、Productを生成したあとに、if文で分岐して実行する。
Java
1SimpleFactory factory = new SimpleFactory(); 2String id = "HAM"; 3Product product = factory.create(id); 4 5if("SPAM".equals(id)){ 6 product.hoge("java", 10); 7} 8else if("HAM".equals(id)){ 9 product.hoge(5, new ArrayList<Integer>()); 10}
###所感
解決案2が自分で考える一番いい手かなと思っていますが、Productにメソッドを集中させていいものかとも感じます。あと解決案2も解決案1同様にif文を使っているので、結局は同じなのではないかと感じてしまいます。きちんとファクトリパターンを適用できているのか分からないので、お答えいただければ幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/04/13 12:15