たいやきを作るとします。
java
1class Taiyaki {
2
3 final String filling;
4
5 Taiyaki(String filling) {
6 this.filling = filling;
7 }
8
9 @Override
10 public String toString() {
11 return filling + "の入ったたいやきだよ!";
12 }
13}
ファクトリを作りましょう。
java
1abstract class TaiyakiFactory {
2 abstract Taiyaki getTaiyaki();
3}
4
5class AnkoTaiyakiFactory extends TaiyakiFactory {
6 @Override
7 Taiyaki getTaiyaki() {
8 return new Taiyaki("あんこ");
9 }
10}
11
12class CreamTaiyakiFactory extends TaiyakiFactory {
13 @Override
14 Taiyaki getTaiyaki() {
15 return new Taiyaki("クリーム");
16 }
17}
18
それぞれのファクトリでそれぞれのたいやきがいっぱい作れます。
java
1// あんこのファクトリ
2TaiyakiFactory factory1 = new AnkoTaiyakiFactory();
3
4// クリームのファクトリ
5TaiyakiFactory factory2 = new CreamTaiyakiFactory();
6
7System.out.println(factory1.getTaiyaki());
8System.out.println(factory2.getTaiyaki());
9System.out.println(factory1.getTaiyaki());
10System.out.println(factory2.getTaiyaki());
あんこの入ったたいやきだよ!
クリームの入ったたいやきだよ!
あんこの入ったたいやきだよ!
クリームの入ったたいやきだよ!
先に後者の「抽象ファクトリクラスに getFactory() のようなメソッドを保持し、その中で具象ファクトリクラスを生成し、抽象ファクトリ型で返却するようなもの 」ですが、
java
1abstract class TaiyakiFactory {
2
3 abstract Taiyaki getTaiyaki();
4
5 static TaiyakiFactory getFactory(String filling) {
6
7 if ("あんこ".equals(filling)) {
8 return new AnkoTaiyakiFactory();
9 } else if ("クリーム".equals(filling)) {
10 return new CreamTaiyakiFactory();
11 } else {
12 throw new IllegalArgumentException("そんな具はないです");
13 }
14 }
15}
こうすると、呼び出し側でファクトリの実装クラスを知らなくてもよいことになります。
つまり、どのファクトリを使うかの判断をファクトリ側に寄せることができます。
java
1// あんこのファクトリ
2TaiyakiFactory factory1 = TaiyakiFactory.getFactory("あんこ");
3
4// クリームのファクトリ
5TaiyakiFactory factory2 = TaiyakiFactory.getFactory("クリーム");
6
7System.out.println(factory1.getTaiyaki());
8System.out.println(factory2.getTaiyaki());
9System.out.println(factory1.getTaiyaki());
10System.out.println(factory2.getTaiyaki());
あんこの入ったたいやきだよ!
クリームの入ったたいやきだよ!
あんこの入ったたいやきだよ!
クリームの入ったたいやきだよ!
次に「Factory クラスが単独 (サブクラス化なし) で存在し、ファクトリメソッドがスタティックメソッドではないもの 」ですが、
java
1class TaiyakiFactory {
2
3 final String filling;
4
5 TaiyakiFactory(String filling) {
6 this.filling = filling;
7 }
8
9 Taiyaki getTaiyaki() {
10 return new Taiyaki(filling);
11 }
12}
こうすると、ファクトリクラスのサブクラスは不要になりますが、
ファクトリ自体がパラメタを持っているので、それぞれのファクトリから生成されるインスタンスを別のものにすることができます。
java
1// あんこのファクトリ
2TaiyakiFactory factory1 = new TaiyakiFactory("あんこ");
3
4// クリームのファクトリ
5TaiyakiFactory factory2 = new TaiyakiFactory("クリーム");
6
7System.out.println(factory1.getTaiyaki());
8System.out.println(factory2.getTaiyaki());
9System.out.println(factory1.getTaiyaki());
10System.out.println(factory2.getTaiyaki());
あんこの入ったたいやきだよ!
クリームの入ったたいやきだよ!
あんこの入ったたいやきだよ!
クリームの入ったたいやきだよ!
どんな風にファクトリを作るのが良いかは場合によるかと思うので、
いろいろな方法があるよ程度に覚えておけばよいかと。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/12/06 03:41