Ok Boom

”勿忘初心,方得始终“

抽象工厂模式

抽象工厂模式

定义

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类

问题

还记得小明船厂之前的业务重组吗,前几天我们把船厂分为了小、中、大3种,这是按规格来划分不同的船去哪个厂建造。但是这样职能就太单一了,那么我们又该如何去划分呢?

怎么解

除了按规格来划分,我们也可以按产品族来划分。小、中、大型船厂都可以生成轮船、快艇,但是因为面积限制,每个船厂生成出的船尺寸可能不太一样。

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
public class Ship {
public String move() {
System.out.println("行驶");
}
}

public class SmallSteamShip extends Ship {
public String move() {
System.out.println("小型轮船在行驶");
}
}

public class SmallSpeedboat extends Ship {
public String move() {
System.out.println("小型快艇在行驶");
}
}

public class MiddleSteamShip extends Ship {
public String move() {
System.out.println("中型轮船在行驶");
}
}

public class MiddleSpeedboat extends Ship {
public String move() {
System.out.println("中型快艇在行驶");
}
}

public interface ShipFactory {
SteamShip createSteamShip();

Speedboat createSpeedboat();
}

public class SmallFactory implements ShipFactory {
public SteamShip createSteamShip() {
System.out.println("生产小型轮船");
return new SteamShip();
}

public Speedboat createSpeedboat() {
System.out.println("生产小型快艇");
return new Speedboat();
}
}

public class MiddleFactory implements ShipFactory {
public SteamShip createSteamShip() {
System.out.println("生产中型轮船");
return new SteamShip();
}

public Speedboat createSpeedboat() {
System.out.println("生产中型快艇");
return new Speedboat();
}
}

public static void main(String [] args) {
ShipFactory shipFactory = new SmallFactory();
shipFactory.createSteamShip();
shipFactory.createSpeedboat();

shipFactory = new MiddleFactory();
shipFactory.createSteamShip();
shipFactory.createSpeedboat();
}

这样如果大型船厂也需要建造这2类船的话,我们不需要去更改公共的方法,只需要新建一个具体工厂去实现即可。