質問: Arrays.asList("いちご", "もも", "いちじく"); System.out.println("五十音順で表示:"); new ListPrinter(new DictionaryOrderComparator()).printList(list); System.out.println(); System.out.println("長さ順で表示:"); new ListPrinter(new LengthOrderComparator()).printList(list); } } ``` 皆さまのご意見をお待ちしています。
回答: そもそも、**ファクトリは生成、ストラテジーは交換、と目的が別**です。 newを置きかえるのがファクトリ、switchを置きかえるのがストラテジーです。 ファクトリは一種類(のクラスから)しか生成しなくても構いません。 切り替えがなくても、初期化の手続きを隠蔽するメリットがあります。 ファクトリメソッドは、テンプレートメソッドのファクトリへの応用です。 そして、テンプレートメソッドとストラテジーは交換という目的が共通です。 ですから、共通点を見いだす質問者の方の気持ちも分からなくもありません。 しかし、**ファクトリメソッドは生成が主、交換が従**です。 生成(を隠蔽)したい → 生成物を切り替えたい → ファクトリメソッド という順番であって、切り替えだけが目的なら、それはストラテジーの方が便利でしょう。 しかし、切り替えならストラテジーの方がスムーズだからと、 ファクトリメソッドをストラテジーで機械的に置きかえるのは疑問です。 たとえ便利でもnewをswitchで置きかえたら違和感があることの延長線上です。 部分的に行数が少なく書けるのと、プログラム全体の保守性などは別の問題ですから。 ですから、ファクトリを使うかどうかは、まずもって生成を隠蔽したいかどうかです。