3.4 建造者模式
在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由 CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员。
建造者(Builder)模式的定义:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。它将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成,将变与不变分离,即产品的组成部分是不变的,但每一部分是灵活选择的。
优点:
- 实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象,也就实现了构建算法、装配算法的解耦,实现了更好的复用。
- 建造者模式将部件与其组装过程分离,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无需知道其内部细节。
缺点:
- 产品的组成部分必须相同,限制了使用范围
- 如果产品内部复杂,产品内部发生了变化,建造者也需要进行修改,后期维护成本大。
与工厂方法模式:
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
模式的结构与实现:
建造者(Builder)模式包含如下角色:
- 抽象建造者(Builder):这个借口规定要实现复杂对象的那些部分的创建,并不设计具体的对象部件的创建。
- 具体建造者(ConcreterBuilder):实现
Builder
接口,完成复杂产品的各个部件的具体创建方法。构造完成后提供产品的实例。 - 产品类(Product):要创建的复杂对象。
- 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按照某种顺序创建。
//产品类
class Product {
private String partA;
private String partB;
private String partC;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
public void setPartC(String partC) {
this.partC = partC;
}
public void show() {
//显示产品的特性
}
}
//抽象建造者
abstract class Builder {
//创建产品对象
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回产品对象
public Product getResult() {
return product;
}
}
//具体建造者
public class ConcreteBuilder extends Builder {
public void buildPartA() {
product.setPartA("建造 PartA");
}
public void buildPartB() {
product.setPartB("建造 PartB");
}
public void buildPartC() {
product.setPartC("建造 PartC");
}
}
//指挥者
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
//产品构建与组装方法
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
//客户类
public class Client {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
product.show();
}
}
模式的应用场景
建造者(Builder)模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将它们组合在一起的算法却相对稳定。
- 创建的对象较复杂,由多个部件构成,各部件面临复杂的变化,但构件间的建造顺序是稳定的;
- 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终表示是独立的;
- 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。
3.5 建造者模式与工厂模式的区别
- 建造者模式更关注方法的顺序,工厂模式更关注创建的对象;
- 创建对象的力度不同,建造者模式创建复杂对象,工厂模式创建的对象都一样;
- 关注重点不同,工厂模式只需要把对象创建出来就行了,而建造者模式还需要知道对象由哪些部件组成;
- 建造者模式更加建造过程中的顺序不一样,最终对象部件组成也不一样。