1. 建造者模式概述
建造者模式(生成器模式)是一种对象构建模式,主要是将复杂对象的建造过程抽象出来,并允许用户只通过指定复杂对象的类型和内容就能构建对象,而不需要知道具体构建的内部细节。
2. 建造者模式
2.1 建造者模式原理图
- Product(产品角色):一个具体的产品对象。
- Builder(抽象构造者):创建Product对象的各个部件指定的接口/抽象类。
- ConcreteBuilder(具体构造者):主要用于构建一个使用Builder接口的对象。其目的在于隔离调用者与对象的生产过程和负责控制产品对象的生产过程。
2.2 建造者模式类图
3. 核心代码
public class HouseDirector {
HouseBuilder houseBuilder = null;
// 构造器传入 houseBuilder
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
// 通过setter 传入 houseBuilder
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
// 如何处理建造房子的流程,交给指挥者
public House constructHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}
4. 和工厂模式的区别
- 抽象工厂模式更多的是对某类型产品的创建,是居右不同分类维度的产品的组合,不需要关心构建过程而只要关心什么产品由什么工厂生产。
- 建造者模式则要求按照指定的规则建造产品,主要目的是组装一个个小的部分来生产新的产品。
5. 使用场景总结
- 调用接口不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,可以很方便地替换具体建造者或增加新的具体建造者,调用不同的具体建造者得到不同的产品对象。
- 可以更加精细地控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
- 增加新的具体建造者无须修改原有类库的代码。
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,所以,如果产品之间的差异性很大,则不适合使用建造者模式。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,则不适合使用建造者模式。
附:
- 完整代码:尚硅谷图解Java设计模式资料下载。