工厂设计模式是众多设计模式当中我最早接触的设计模式,也是一种应用最为广泛的设计模式,属于创建型设计模式。在Spring框架中,也有很经典的应用。在我对其进行了解的时候,发现有几种不同的工厂模式,本文对这几种工厂模式之间的差别进行一下分析和解读。

工厂模式的产生,是为了降低代码耦合,统一管理产品,提高工作效率。

四种常见的工厂模式

  1. StaticFactory Method - 静态工厂方法
  2. SimpleFactory - 简单工厂
  3. Factory Method - 工厂方法
  4. Abstract Factory - 抽象工厂模式

StaticFactory Method

相对于构造器来说,静态工厂有如下优势:

  • 方法名称不是固定的,可以自定义有意义的方法名称
  • 返回值可以是原类型、子类型或是原始类型
  • 可以控制类的实例,单例模式就是一种很好的应用

静态工厂在jdk中也有使用,例如String、Integer、Long、Optional、Collections等包含的一系列静态工厂方法:

  • String.valueOf(1000L);
  • Integer.valueOf(“180”);
  • Long.valueOf(“9999”);
  • Optional.of(“value”);
  • Collections.synchronizedCollection(originalCollection);

Simple Factory

简单工厂模式,有一个专门的工厂类,可以根据参数去生产特定的产品,它不属于23GOF。例如下面的一个电脑工厂:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SimpleFactory {

public static final int HP = 1;
public static final int LENOVO = 2;
public static final int APPLE = 3;

public static Computer createComputer(int param) {
switch (param) {
case HP:
return new HpComputer();
case LENOVO:
return new LenovoComputer();
case APPLE:
return new AppleComputer();
default:
return null;
}
}
}

Factory Method

工厂模式有一个工厂父类,提供了生产电脑的接口,各个厂牌的工厂可以去继承并实现它,完成自己的生产逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 父类工厂
public interface ComputerFactory {

Computer createComputer();
}
// 惠普工厂实现
public class HpComputerFactory implements ComputerFactory {

@Override
public Computer createComputer() {
return new HpComputer();
}
}
// 联想工厂实现
public class LenovoComputerFactory implements ComputerFactory {

@Override
public Computer createComputer() {
return new LenovoComputer();
}
}

Abstract Factory

到了抽象工厂,就要提到产品簇(Product Family)的概念。产品簇指的是具有相似功能的一系列产品,它们通常需要聚合或是搭配着来完成一项功能。例如上面的电脑产品,其可以被拆分为主机、屏幕、键盘、鼠标、耳机等等。这些拆分的部件通常也不是在一个工厂完成生产,而且也不一定都和自己的厂牌结合使用。厂牌下的各个子产品的生产逻辑抽象出来产生了抽象工厂这种设计方法。例如:

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
// 父类产品工厂
public interface ComputerProductFactory {

Keyboard createKeyboard();

Mouse createMouse();

Earphone createEarphone();
}
// 惠普产品工厂实现
public class HpProductFactory implements ComputerProductFactory {
@Override
public Keyboard createKeyboard() {
return new HpKeyboard();
}

@Override
public Mouse createMouse() {
return new HpMouse();
}

@Override
public Earphone createEarphone() {
return new HpEarphone();
}
}
// 联想产品工厂实现
public class LenovoProductFactory implements ComputerProductFactory {
@Override
public Keyboard createKeyboard() {
return new LenovoKeyboard();
}

@Override
public Mouse createMouse() {
return new LenovoMouse();
}

@Override
public Earphone createEarphone() {
return new LenovoEarphone();
}
}

产品簇指具有相同或相似的功能结构或性能,共享主要的产品特征、组件或子结构,并通过变型配置来满足特定市场的一组产品的聚类。其背景是一个规划精良的结构,即可以用来生成产品族的产品族概念结构和总体逻辑结构,有助于把握和利用产品的共性。每一个新产品都是该结构的具体实例,也是对结构的扩展。