hooyantsing's Blog

P57 建造者模式(3)-盖房子

字数统计: 494阅读时长: 2 min
2020/11/09

尚硅谷Java设计模式(图解+框架源码剖析)

建造者模式 BuilderPattern

产品和产品零件制作过程分离解耦。

建造者模式和工厂模式的区别

工厂模式是产品和工厂的关系,建造者模式是产品和产品零件的关系。

角色
  • 产品
  • 所需零件模板
  • 具体的产品零件生产方式
  • 指挥者

案例

产品是房子,产品零件是地基、墙和顶,指挥者是负责成产调度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
classDiagram
class House
class HouseBuilder{
<<abstract>>
#House house
+buildBisic()* void
+buildWall()* void
+buildRoofed()* void
+buildHouse() House;
}
class CommonHouse
class HighHouse
class HouseDirector{
-HouseBuilder houseBuilder
+setHouseBuilder() void
+constructHouse() House
}
HouseBuilder *-- House
HouseBuilder <|.. CommonHouse
HouseBuilder <|.. HighHouse
HouseDirector o-- HouseBuilder

产品:

1
2
3
4
5
6
7
8
9
// 产品
public class House {
// 产品零件
private String baise;
private String well;
private String roofed;

// more getter setter
}

所需零件模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class HouseBuilder {
// 空产品
protected House house = new House();

// 生产零件
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void buildRoofed();

// 产品出厂
public House buildHouse(){
return house;
}
}

具体的产品零件生产方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("普通房子地基10米");
}

@Override
public void buildWalls() {
System.out.println("普通房子垒墙10米");
}

@Override
public void buildRoofed() {
System.out.println("普通房子封顶");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class HighHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("大厦地基50米");
}

@Override
public void buildWalls() {
System.out.println("大厦垒墙50米");
}

@Override
public void buildRoofed() {
System.out.println("大厦封顶");
}
}

指挥者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class HouseDirector {
private HouseBuilder houseBuilder = null;

public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}

// 切换
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}

// 如何建造房子,交给指挥者
public House constructHouse(){
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.buildRoofed();
return houseBuilder.buildHouse();
}
}

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Client {
public static void main(String[] args) {
// 建造普通房子
CommonHouse commonHouse = new CommonHouse();
// 准备创建房子指挥者
HouseDirector houseDirector = new HouseDirector(commonHouse);
// 房子出厂
House houseC = houseDirector.constructHouse();

// 切换,建造大厦
HighHouse highHouse = new HighHouse();
houseDirector.setHouseBuilder(highHouse);
House houseH = houseDirector.constructHouse();
}
}
CATALOG
  1. 1. 建造者模式 BuilderPattern
    1. 1.1. 建造者模式和工厂模式的区别
    2. 1.2. 角色
  2. 2. 案例