AbstractFactoryパターン
デザインパターンの一つであるAbstractFactoryパターンについて記述する。
AbstractFactoryパターンとは?
AbstractFactoryパターンは、関連する複数のJavaオブジェクト をカプセル化する。
AbstractFactoryパターンを意識して実装することで、開発者はソースコードでInputとOutput理解をしやすくなる。
役割・責務を整理する
上記の画像を例に整理する。
AbstractProduct(AbProduct[1,2,3])
- Javaのabstractクラス(抽象化)を定義する。
ConcretProduect(CnProduct[A1,A2,A3])
- Javaのabstract(抽象化した内容)を実装するクラス。
Abstractfactory
- AbstractProduct[1,2,3]の抽象化メソッドを保持する。
ConcreteImpl[A,B]
- AbstracFactoryの実装クラス。
サンプルコード
AbProduce1.java1
2
3
4
5
6
7
8
9public abstract class AbProduct1 {
protected String name;
public AbProduct1(String name) {
this.name = name;
}
public abstract void execute();
}
AbProduct2.java1
2
3
4
5
6
7
8
9public abstract class AbProduct2 {
protected String name;
public AbProduct(String name) {
this.name = name;
}
public abstract void run();
}
AbProduct3.java1
2
3
4
5
6
7
8
9public abstract class AbProduct3 {
protected String name;
public AbProduct3(String name) {
this.name = name;
}
public abstract void action();
}
CnProductA1.java1
2
3
4
5
6
7
8
9public class CnProductA1 extends AbProduct1 {
public CnProductA1(String name) {
super(name);
}
public void execute() {
System.out.println(String.format("%s A1 execute.", name));
}
}
CnProductA2.java1
2
3
4
5
6
7
8
9public class CnProductA2 extends AbProduct2 {
public CnProductA2(String name) {
super(name);
}
public void run() {
System.out.println(String.format("%s A2 run,", name));
}
}
CnProductA3.java1
2
3
4
5
6
7
8
9public class CnProduct3 extends AbProduct3 {
public CnProduct(String name) {
super(name);
}
public void action() {
System.out.println(String.format("%s A3 action.", name));
}
}
CnProductB1.java1
2
3
4
5
6
7
8
9public class CnProductB1 extends AbProduct1 {
public CnProductB1(String name) {
super(name);
}
public void execute() {
System.out.println(String.format("%s B1 execute", name));
}
}
CnProductB2.java1
2
3
4
5
6
7
8
9public class CnProductB2 extends AbProduct2 {
public CnProductB2(String name) {
super(name);
}
public void run() {
System.out.println(String.format("%s B2 run", name));
}
}
CnProductB3.java1
2
3
4
5
6
7
8
9public class CnProductB3 extends AbProduct3 {
public CnProductB3(String name) {
super(name);
}
public void action() {
System.out.println(String.format("%s B3 action", name));
}
}
AbstractFactory.java1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public abstract class AbstractFactory {
public static AbstractFactory createFactory(int id) {
switch (id) {
case CnFactoryA.ID:
return new CnFactoryA();
case CnFactoryB.ID:
return new CnFactoryB();
}
}
public abstract AbProduct1 creteProduct1();
public abstract AbProduct2 creteProduct2();
public abstract AbProduct3 creteProduct3();
}
CnFactoryA.java1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class CnFactoryA extends AbstractFactiry {
public static final int ID = 1;
public AbProduct1 createProduct1() {
return new CnProductA1("factory A1");
}
public AbProduct2 createProduct2() {
return new CnProductA2("factory A2");
}
public AbProduct3 createProduct3() {
return new CnProductA3("factory A3");
}
}
CnFactoryB.java1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class CnFactoryB extends AbstractFactiry {
public static final int ID = 2;
public AbProduct1 createProduct1() {
return new CnProductB1("factory B1");
}
public AbProduct2 createProduct2() {
return new CnProductB2("factory B2");
}
public AbProduct3 createProduct3() {
return new CnProductB3("factory B3");
}
}