浅谈Java设计模式系列0x05---建造者模式

浅谈Java设计模式系列0x00
浅谈Java设计模式系列0x01—单例模式
浅谈Java设计模式系列0x02—简单工厂模式
浅谈Java设计模式系列0x03—工厂方法模式
浅谈Java设计模式系列0x04—抽象工厂模式

我们前面讲的设计模式都是创建型的模式,这次要讲的也是一种创建型的模式—–建造者模式;

建造者模式

建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节;

模式结构

抽象建造者(Builder):

  • 为创建一个Product对象的各个部件指定的抽象接口;

具体建造者(ConcreteBuilder):

  • 实现Builder的接口以构造和装配该产品的各个部件;
  • 定义并明确它所创建的表示;
  • 提供一个检索产品的接口;

指挥者(Director):

  • 构造一个使用Builder接口的对象;

产品角色(Product):

  • 表示被构造的复杂对象,ConcreteBuilder创建该产品的内部表示并定义它的装配过程;
  • 包含定义组成部件的类,包括将这些部件装配成最终产品的接口

模式特征

建造者模式有以下的一些基本的特点:

  1. 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性;
  2. 需要生成的产品对象的属性相互依赖,需要指定其生成顺序;
  3. 对象的创建过程独立于创建该对象的类,在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中;
  4. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品;

举个例子

代码参考
本次按照惯例,还是使用手机作为例子;

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/**
* 复杂的产品对象
*/

public class Phone {
//手机产品的属性
private String cpu = "";
private String os = "";
private String brand = "";


public void setCpu(String cpu) {
this.cpu = cpu;
}

public void setOs(String os) {
this.os = os;
}

public void setBrand(String brand) {
this.brand = brand;
}

public void info() {
System.out.println("This phone is " + brand + "'s phone with " + cpu + " CPU and " + os + " operating system!");
}
}

/**
* 抽象的建造者类
* 用于指定创建复杂产品的各个部件接口
*/

public abstract class PhoneBuilder {
protected Phone phone;

public Phone getPhone() {
return phone;
}

public void createNewPhone() {
phone = new Phone();
}
//用于创建手机对象的接口
public abstract void buildCPU();
public abstract void buildOS();
public abstract void buildBrand();
}

/**
* 具体的产品对象,实现产品各个部件的装配
*
*/

public class AndroidPhoneBuilder extends PhoneBuilder {
@Override
public void buildCPU() {
phone.setCpu("Qualcomm");
}
@Override
public void buildOS() {
phone.setOs("Android");
}
@Override
public void buildBrand() {
phone.setBrand("Google");
}
}
/**
* 具体的产品对象,实现产品各个部件的装配
*
*/

public class ApplePhoneBuilder extends PhoneBuilder {
@Override
public void buildCPU() {
phone.setCpu("A10");
}
@Override
public void buildOS() {
phone.setOs("IOS");
}
@Override
public void buildBrand() {
phone.setBrand("Apple");
}
}

/**
* 指挥者 使用Builder来构建复杂的对象
*/

public class Worker {
private PhoneBuilder phoneBuilder;
//设置具体的PhoneBuilder
public void setPhoneBuilder(PhoneBuilder phoneBuilder) {
this.phoneBuilder = phoneBuilder;
}

public Phone getPhone() {
return phoneBuilder.getPhone();
}
//使用phoneBuilder构建装配Phone
public void constructPhone() {
phoneBuilder.createNewPhone();
phoneBuilder.buildCPU();
phoneBuilder.buildOS();
phoneBuilder.buildBrand();
}
}

/**
* 测试类
*/

public class Client {
public static void main(String[] args){
Worker worker=new Worker();
PhoneBuilder appleBuilder=new ApplePhoneBuilder();
worker.setPhoneBuilder(appleBuilder);
worker.constructPhone();
Phone phone = worker.getPhone();
phone.info();
}
}

运行结果:

1
This phone is Apple's phone with A10 CPU and IOS operating system!

总结

建造者模式的优点在于它将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象;
每一个建造者都是独立的,因此也可以方便的添加新的建造者;
但由于建造者模式所创建的产品具有较多的共同点,如果产品内部复杂,则需要较多的建造者类来实现这种变化;

参考

生成器模式
建造者模式