Factory MethodパターンとStrategyパターンは、そもそも目的自体が異なるもの(Factory Methodはオブジェクトの生成の切り替え、Strategyはオペレーションの切り替え)と理解していますが、
WikipediaのFactory Method パターンの利用例を参照していて疑問に思ったので質問させてください。
Wikipediaの利用例↓
Java
1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.Collections; 4import java.util.Comparator; 5import java.util.List; 6 7// Creatorに相当する 8abstract class ListPrinter { 9 // anOperationに相当する 10 public void printList(List<String> list) { 11 Comparator<String> comparator = createComparator(); 12 list = new ArrayList<String>(list); 13 14 Collections.sort(list, comparator); 15 16 for (String item : list) { 17 System.out.println(item); 18 } 19 } 20 21 // factoryMethodに相当する 22 protected abstract Comparator<String> createComparator(); 23} 24 25// ConcreteCreatorに相当する 26class DictionaryOrderListPrinter extends ListPrinter { 27 @Override 28 protected Comparator<String> createComparator() { 29 return new DictionaryOrderComparator(); 30 } 31} 32 33// java.util.ComparatorがProductに相当する 34 35// ConcreteProductに相当する 36class DictionaryOrderComparator implements Comparator<String> { 37 @Override 38 public int compare(String str1, String str2) { 39 return str1.compareTo(str2); 40 } 41} 42 43// ConcreteCreatorに相当する 44class LengthOrderListPrinter extends ListPrinter { 45 @Override 46 protected Comparator<String> createComparator() { 47 return new LengthOrderComparator(); 48 } 49} 50 51// ConcreteProductに相当する 52class LengthOrderComparator implements Comparator<String> { 53 public int compare(String str1, String str2) { 54 return str1.length() - str2.length(); 55 } 56} 57 58// メインクラス 59public class FactoryMethodSample { 60 public static void main(String args[]) { 61 List<String> list = Arrays.asList("いちご", "もも", "いちじく"); 62 63 System.out.println("五十音順で表示:"); 64 new DictionaryOrderListPrinter().printList(list); 65 66 System.out.println(); 67 68 System.out.println("長さ順で表示:"); 69 new LengthOrderListPrinter().printList(list); 70 } 71}
上記の利用例は下記のStrategyパターンで置き換えられると思いますが、
具体的にそれぞれのメリット・デメリットが腹に落ちず、使い分けの基準等あればご教示いただけますでしょうか。
個人的には、Strategyの方が、構成要素が少ない分利用者側での拡張が容易(Comparatorの実装クラスだけ用意すればいい)かと思います。
一方で、Printerが何のComparatorを持っているかを隠ぺいしたい場合はFactoryの方が適していると思います。
利用者側というより、提供者側でComparatorを拡張したい場合に利用者に影響がない。
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; // Creatorに相当する class ListPrinter { Comparator<String> comparator; // コントラクタでStrategyを渡す ListPrinter(Comparator<String> comparator) { this.comparator = comparator; } // anOperationに相当する public void printList(List<String> list) { list = new ArrayList<String>(list); Collections.sort(list, comparator); for (String item : list) { System.out.println(item); } } } // ConcreteProductに相当する class DictionaryOrderComparator implements Comparator<String> { @Override public int compare(String str1, String str2) { return str1.compareTo(str2); } } // ConcreteProductに相当する class LengthOrderComparator implements Comparator<String> { public int compare(String str1, String str2) { return str1.length() - str2.length(); } } // メインクラス public class FactoryMethodSample { public static void main(String args[]) { List<String> list = Arrays.asList("いちご", "もも", "いちじく"); System.out.println("五十音順で表示:"); new ListPrinter(new DictionaryOrderComparator()).printList(list); System.out.println(); System.out.println("長さ順で表示:"); new ListPrinter(new LengthOrderComparator()).printList(list); } }
皆さまのご意見をお待ちしています。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。