1. 定义
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。
可以用来简化复杂对象的构造过程。
对比现实世界,类似于:
- 要造一台计算机主机,需要CPU、内存卡、显卡、电源等。组装过程也相对复杂,比如一些接线的处理。
- 要造一辆汽车,需要底盘、方向盘、发动机、座椅、轮子等等。
- 要造航空母舰,需要甲板、起飞装置、机库、动力系统、武器库等。
复杂对象一般具有这些特点:
- 整体由多个部件组成。
- 丰富的组装配置。
- 复杂的组装流程。
建造者模式,把复杂的对象创建过程进行剥离,尤其是内部部件的配置,进行独立变化和维护。
2. 模式结构
主要角色有:
- 抽象建造者(Abstract Builder),声明需要的部件。
- 具体建造者(Concrete Builder),定义明确的部件。
- 指挥者(Director),指挥组装过程。
- 产品(Product),产品,由多个部件组成。
类图如下:
3. 代码
产品类,由多个部分组成,不同部分的组合可以视为一个新的产品:
public class Product {
private Part1 part1;
private Part2 part2;
private Part3 part3;
public void setPart1(Part1 part1) {
this.part1 = part1;
}
public void setPart2(Part2 part2) {
this.part2 = part2;
}
public void setPart3(Part3 part3) {
this.part3 = part3;
}
}
抽象构建者:
public interface IBuilder {
private Product product;
public void build1();
public void build2();
public void build3();
public Product getResult();
}
具体构建者 A:
public class BuilderA implements IBuilder {
private Product product;
public BuilderA() {
product = new Product();
}
public void build1() {
product.setPart1("A1");
}
public void build2() {
product.setPart2("A2");
}
public void build3() {
product.setPart3("A3");
}
public Product getResult() {
return product;
}
}
指挥者,指挥构建者生成产品:
public class Director {
private IBuilder builder;
public Director(IBuilder builder) {
this.builder = builder;
}
public Product construct() {
builder.build1();
builder.build2();
builder.build3();
return builder.getResult();
}
}
4. 特点
4.1. 优势
- 屏蔽细节:使用者不需要完全了解建造细节。
- 易于扩展:不同的建造者相互独立,新的产品可以创建新的建造者。
4.2. 缺点
- 局限性:产品组成部分必须大部分相同。
- 类膨胀:如果产品数量过多,也会导致建造者的数量膨胀。
4.3. 注意事项
- 只有一种产品时,可以使用无抽象建造者,指挥者和建造者在一个类里面实现。
- 多个产品差异很大的情况下,不推荐使用建造者。
4.4. 和抽象工厂模式的区别
- 建造者模式返回一个完整产品,抽象工厂返回一套产品
- 建造者模式侧重构造和组建复杂产品,工厂模式侧重生产不同类型的产品。