AbstractFactoryパターン Java

2015/07/27

AbstractFactoryパターン

デザインパターンの一つであるAbstractFactoryパターンについて記述する。

AbstractFactoryパターンとは?



AbstractFactoryパターンは、関連する複数のJavaオブジェクト をカプセル化する。
AbstractFactoryパターンを意識して実装することで、開発者はソースコードでInputとOutput理解をしやすくなる。

役割・責務を整理する

上記の画像を例に整理する。

  1. AbstractProduct(AbProduct[1,2,3])

    • Javaのabstractクラス(抽象化)を定義する。
  2. ConcretProduect(CnProduct[A1,A2,A3])

    • Javaのabstract(抽象化した内容)を実装するクラス。
  3. Abstractfactory

    • AbstractProduct[1,2,3]の抽象化メソッドを保持する。
  4. ConcreteImpl[A,B]

    • AbstracFactoryの実装クラス。

サンプルコード

AbProduce1.java

1
2
3
4
5
6
7
8
9
public abstract class AbProduct1 {
protected String name;

public AbProduct1(String name) {
this.name = name;
}

public abstract void execute();
}

AbProduct2.java

1
2
3
4
5
6
7
8
9
public abstract class AbProduct2 {
protected String name;

public AbProduct(String name) {
this.name = name;
}

public abstract void run();
}

AbProduct3.java

1
2
3
4
5
6
7
8
9
public abstract class AbProduct3 {
protected String name;

public AbProduct3(String name) {
this.name = name;
}

public abstract void action();
}

CnProductA1.java

1
2
3
4
5
6
7
8
9
public class CnProductA1 extends AbProduct1 {
public CnProductA1(String name) {
super(name);
}

public void execute() {
System.out.println(String.format("%s A1 execute.", name));
}
}

CnProductA2.java

1
2
3
4
5
6
7
8
9
public class CnProductA2 extends AbProduct2 {
public CnProductA2(String name) {
super(name);
}

public void run() {
System.out.println(String.format("%s A2 run,", name));
}
}

CnProductA3.java

1
2
3
4
5
6
7
8
9
public class CnProduct3 extends AbProduct3 {
public CnProduct(String name) {
super(name);
}

public void action() {
System.out.println(String.format("%s A3 action.", name));
}
}

CnProductB1.java

1
2
3
4
5
6
7
8
9
public class CnProductB1 extends AbProduct1 {
public CnProductB1(String name) {
super(name);
}

public void execute() {
System.out.println(String.format("%s B1 execute", name));
}
}

CnProductB2.java

1
2
3
4
5
6
7
8
9
public class CnProductB2 extends AbProduct2 {
public CnProductB2(String name) {
super(name);
}

public void run() {
System.out.println(String.format("%s B2 run", name));
}
}

CnProductB3.java

1
2
3
4
5
6
7
8
9
public class CnProductB3 extends AbProduct3 {
public CnProductB3(String name) {
super(name);
}

public void action() {
System.out.println(String.format("%s B3 action", name));
}
}

AbstractFactory.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public 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.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public 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.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public 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");
}
}