移动架构之建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

建造者模式中的角色

抽象建造者:给出一个抽象接口,定义了需要进行的工作,就像指导手册一样
具体建造者:具体的建造者完成抽象方法,返回对象
设计者(指导者):所有提出的需求在设计者这个类里面都能找得到
产品:制造出来的产品

使用场景

  • 需要生成的对象具有复杂的内部结构
  • 需要生成的对象内部属性本身相互依赖

与工厂模式的区别:建造者模式更加关注与零件装配的顺序

实例说明

以建造一个房子为例
抽象建造者

1
2
3
4
5
public interface Build {
public void makeWindow();
public void makeFloor();
public Room getRoom();
}

具体建造者

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

private Room room=new Room();

@Override
public void makeWindow() {
room.setFloor("地板");
}

@Override
public void makeFloor() {
room.setWindow("窗户");
}

@Override
public Room getRoom() {
return room;
}
}

设计者

1
2
3
4
5
6
7
public class Designer {

public void order(Build build) {
build.makeFloor();
build.makeWindow();
}
}

产品

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
public class Room {

private String window;
private String floor;

public String getWindow() {
return window;
}

public void setWindow(String window) {
this.window = window;
}

public String getFloor() {
return floor;
}

public void setFloor(String floor) {
this.floor = floor;
}

@Override
public String toString() {
return "floor: " + floor + ", window: " + window;
}
}

测试类

1
2
3
4
5
6
7
8
public class Client {
public static void main(String[] args) {
Build worker = new WorkBuilder(); //获取工人对象
Designer designer = new Designer(); //获取设计师对象
designer.order(worker); //设计师指挥工人工作
System.out.println(worker.getRoom()); //工人交房
}
}

建造者模式的常用方式

在建造者模式中,在实际运用的时候往往会省略掉设计者这个角色
其主要是考虑到不向外暴露太多实现细节
使用链式构建,使得对外隐藏所有细节,这也是build采用的设计思想

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Room {

private String window;
private String floor;

public void apply(WorkBuilder.RoomParmas parmas)
{
window=parmas.window;
floor=parmas.floor;
}

@Override
public String toString() {
return "floor: " + floor + ", window: " + window;
}
}

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
public class WorkBuilder{

private RoomParmas parmas;

public WorkBuilder( ) {
this.parmas = new RoomParmas();
}

public WorkBuilder makeWindow(String window ) {
parmas.window = window;
return this;
}

public WorkBuilder makeFloor(String floorCorlor) {
parmas.floor = floorCorlor;
return this;
}

public Room build() {
Room room = new Room();
room.apply(parmas);
return room;
}

class RoomParmas {
public String window;
public String floor;
}
}
1
2
3
4
5
6
7
public class Client {
public static void main(String[] args) {
Room room = (new WorkBuilder()).makeWindow("玻璃")
.makeFloor("地板").build();
System.out.println(room);
}
}
Donate comment here