参考文献

抽象工厂模式

  • 抽象工厂提供了用于创建一系列相关对象的接口,而无需显式指定它们的类.

  • 抽象工厂模式通过定义抽象工厂接口及其下属的多个产品接口和多个产品族实现类,每个产品族实现类负责创建一组相关的产品.客户端通过调用抽象工厂接口来创建产品,具体使用哪个产品族实现类由客户端决定.抽象工厂模式将产品的创建延迟到具体产品族实现类中,使得产品的创建与使用相互独立.

    img

    • 上图(图片来自于refactoringguru.cn)的"装饰风艺术"的椅子,沙发,咖啡桌为一个产品族
    • 抽象工厂的工作是将"抽象零件"组装为"抽象产品"

组件

  • AbstractProduct(抽象产品) : 声明产品对象类型的接口

  • AbstractFactory(抽象工厂) : 声明创建抽象产品的操作的接口

  • ConcreteProduct(具体产品) - 定义由相应的ConcreteFactory创建的产品;它实现了AbstractProduct 接口

  • ConcreteFactory(具体工厂) : 实现创建具体产品的操作.

  • Client -使用 AbstractFactoryAbstractProduct 类声明的接口.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

abstract class AbstractProductA{
public abstract void operationA1();
public abstract void operationA2();
}

class ProductA1 extends AbstractProductA{
ProductA1(String arg){
System.out.println("Hello "+arg);
} // Implement the code here
public void operationA1() { };
public void operationA2() { };
}

class ProductA2 extends AbstractProductA{
ProductA2(String arg){
System.out.println("Hello "+arg);
} // Implement the code here
public void operationA1() { };
public void operationA2() { };
}

abstract class AbstractProductB{
//public abstract void operationB1();
//public abstract void operationB2();
}

class ProductB1 extends AbstractProductB{
ProductB1(String arg){
System.out.println("Hello "+arg);
} // Implement the code here
}

class ProductB2 extends AbstractProductB{
ProductB2(String arg){
System.out.println("Hello "+arg);
} // Implement the code here
}

abstract class AbstractFactory{
abstract AbstractProductA createProductA();
abstract AbstractProductB createProductB();
}

class ConcreteFactory1 extends AbstractFactory{
AbstractProductA createProductA(){
return new ProductA1("ProductA1");
}
AbstractProductB createProductB(){
return new ProductB1("ProductB1");
}
}

class ConcreteFactory2 extends AbstractFactory{
AbstractProductA createProductA(){
return new ProductA2("ProductA2");
}
AbstractProductB createProductB(){
return new ProductB2("ProductB2");
}
}

//Factory creator - an indirect way of instantiating the factories
class FactoryMaker{
private static AbstractFactory pf=null;
static AbstractFactory getFactory(String choice){
if(choice.equals("a")){
pf=new ConcreteFactory1();
}else if(choice.equals("b")){
pf=new ConcreteFactory2();
} return pf;
}
}

// Client
public class Client{
public static void main(String args[]){
AbstractFactory pf=FactoryMaker.getFactory("a");
AbstractProductA product=pf.createProductA();
//more function calls on product
}
}

实现方式

  • 以不同的产品类型与产品变体为维度绘制矩阵。
  • 为所有产品声明抽象产品接口。 然后让所有具体产品类实现这些接口。
  • 声明抽象工厂接口, 并且在接口中为所有抽象产品提供一组构建方法。
  • 为每种产品变体实现一个具体工厂类。
  • 在应用程序中开发初始化代码。 该代码根据应用程序配置或当前环境, 对特定具体工厂类进行初始化。 然后将该工厂对象传递给所有需要创建产品的类。
  • 找出代码中所有对产品构造函数的直接调用, 将其替换为对工厂对象中相应构建方法的调用。

简单工厂/工厂方法/抽象工厂三者总结

  • 简单工厂模式是工厂方法模式和抽象工厂模式的简化形式,它只有一个具体工厂类,根据参数来创建对象.
  • 工厂方法模式通过定义工厂接口和多个具体工厂类,将对象的创建和使用解耦,每个具体工厂类负责创建一种类型的对象.
  • 抽象工厂模式通过定义抽象工厂接口和多个产品接口以及多个产品族实现类,将产品的创建和使用解耦,每个产品族实现类负责创建一组相关的产品.