建造者模式
欢迎来到我的 ChatGPT 中转站,极具性价比,为付费不方便的朋友提供便利,有需求的可以添加左侧 QQ 二维码,另外,邀请新用户能获取余额哦!最后说一句,那啥:请自觉遵守《生成式人工智能服务管理暂行办法》。
# 简介
盖房项目需求
- 需要建房子:这一过程为打桩、砌墙、封顶
- 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的
# 传统方式
# 代码案例
/**
* 抽象房子类
*/
public abstract class AbstractHouse {
// 打地基
public abstract void buildBasic();
// 砌墙
public abstract void buildWalls();
// 封顶
public abstract void roofed();
public void build() {
buildBasic();
buildWalls();
roofed();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 具体房子实现类
*/
public class CommonHouse extends AbstractHouse {
@Override
public void buildBasic() {
System.out.println(" 普通房子打地基 ");
}
@Override
public void buildWalls() {
System.out.println(" 普通房子砌墙 ");
}
@Override
public void roofed() {
System.out.println(" 普通房子封顶 ");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Client {
public static void main(String[] args) {
CommonHouse commonHouse = new CommonHouse();
commonHouse.build();
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 优缺点说明
- 优点
- 比较好理解,简单易操作
- 缺点
- 设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说,这种设计方案,把产品 (即:房子) 和创建产品的过程 (即:建房子流程) 封装在一起,耦合性增强了。
- 解决方案:将产品和产品建造过程解耦 => 建造者模式
# 建造者模式
# 说明
建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方 法可以构造出不同表现(属性)的对象。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
建造者模式的四个角色
- Product(产品角色): 一个具体的产品对象。
- Builder(抽象建造者): 创建一个 Product 对象的各个部件指定的 接口 / 抽象类。
- ConcreteBuilder(具体建造者): 实现接口,构建和装配各个部件。
- Director(指挥者):构建一个使用 Builder 接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是隔离了客户与对象的生产过程,二是负责控制产品对象的生产过程。
# 代码案例
/**
* 房子对象
*/
@Data
@ToString
public class House {
private String baise;
private String wall;
private String roofed;
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
/**
* 抽象的建造者
*/
public abstract class HouseBuilder {
protected House house = new House();
//将建造的流程写好, 抽象的方法
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void roofed();
public House buildHouse() {
return house;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 指挥者,这里去指定制作流程,返回产品
*/
@Setter
@AllArgsConstructor
public class HouseDirector {
private HouseBuilder houseBuilder;
// 处理建造房子的流程,交给指挥者
public House constructHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 普通房子
*/
public class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
super.house.setBaise("普通房子打地基5米");
}
@Override
public void buildWalls() {
super.house.setWall("普通房子砌墙10cm");
}
@Override
public void roofed() {
super.house.setRoofed("普通房子屋顶");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 实现建造者类
*/
public class HighBuilding extends HouseBuilder {
@Override
public void buildBasic() {
super.house.setBaise("高楼的打地基100米");
}
@Override
public void buildWalls() {
super.house.setWall("高楼的砌墙20cm");
}
@Override
public void roofed() {
super.house.setRoofed("高楼的透明屋顶");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 盖普通房子
CommonHouse commonHouse = new CommonHouse();
// 准备创建房子的指挥者
HouseDirector houseDirector = new HouseDirector(commonHouse);
// 完成盖房子,返回产品(普通房子)
House cHouse = houseDirector.constructHouse();
System.out.println(cHouse);
System.out.println("--------------------------");
// 盖高楼
HighBuilding highBuilding = new HighBuilding();
// 重置建造者,选用set的方式
houseDirector.setHouseBuilder(highBuilding);
// 完成盖房子,返回产品(高楼)
House hhHouse = houseDirector.constructHouse();
System.out.println(hhHouse);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 特点和优势
解耦产品的内部组成和创建过程: 客户端不需要知道产品的内部组成细节,而是通过指导者来指导产品的创建过程,从而实现了产品与创建过程的解耦。这使得相同的创建过程可以创建不同的产品对象。
具体建造者的独立性: 每个具体建造者都是相对独立的,与其他建造者无关。这使得可以方便地替换或增加新的具体建造者,用户通过选择不同的具体建造者即可得到不同的产品对象。
精细控制产品创建过程: 建造者模式允许将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
符合开闭原则: 增加新的具体建造者无需修改原有类库的代码,而是通过编程针对抽象建造者类,实现了系统的扩展方便,符合开闭原则。
产品相似性和适用范围: 如果产品之间的差异性很大,建造者模式可能不适用。建造者模式所创建的产品一般具有较多的共同点,组成部分相似。
考虑内部变化复杂性: 如果产品的内部变化复杂,可能需要定义许多具体建造者类,导致系统庞大,需要谨慎选择是否使用建造者模式。
与抽象工厂模式的区别: 建造者模式和抽象工厂模式都涉及到创建对象,但建造者模式强调按照指定的蓝图构建产品,而抽象工厂模式强调创建产品家族,不关心构建过程。
上次更新: 2025/04/12, 07:54:33