1. 建造者模式的介绍
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式主要用于构建复杂的对象,同时客户端并不需要知道对象是如何构建的。
其中要涉及到以下几个角色:
可以简单的理解为我们的建造者 Buidler 是一个大工厂,其中有多个小工厂负责创建我们最终目标产品 Product 的各个组成部分。当把各个组成部分构建好了,最终便可得到我们需要的复杂对象。就比如说要组装一台电脑,需要将其中的各个零件按照一定顺序组装才能得到我们最终想要的电脑,而这个具体的组装顺序则是交由指挥者 Director 完成。
2. 模拟生产套餐的例子
以生活中去麦当劳购买套餐为例子。套餐由多个单品组成,需要生产好其中的各个单品才可得到最终的套餐。因而,可将套餐看成是我们最终需要得到的复杂产品对象。而其中的各个单品则是需要构建的各个组成部分。具体的建造者是生产食物的员工,服务员负责指挥员工去生产食物,因而可将其看成指挥者。
以下通过 Java
代码来实现上述场景。
(1)定义一个产品对象,表示我们最终得到的复杂对象:
public class Product {
private String buildA;
private String buildB;
private String buildC;
private String buildD;
// 省略 getter/setter, toString()
}
(2)定义一个抽象类 Builder
,其中包含构建复杂对象各个组成部分的抽象方法,并提供一个返回目标产品的抽象方法:
public abstract class Builder {
abstract void buildA();
abstract void buildB();
abstract void buildC();
abstract void buildD();
abstract Product getProduct();
}
(3)定义具体的建造者对象继承自 Builder
,假设我们要生产一个麦当劳的套餐:
public class Worker extends Builder {
private Product product;
public Worker() {
this.product = new Product();
}
@Override
void buildA() {
product.setBuildA("生产汉堡");
System.out.println("生产汉堡");
}
@Override
void buildB() {
product.setBuildB("生产可乐");
System.out.println("生产可乐");
}
@Override
void buildC() {
product.setBuildC("生产薯条");
System.out.println("生产薯条");
}
@Override
void buildD() {
product.setBuildD("生产甜点");
System.out.println("生产甜点");
}
@Override
Product getProduct() {
return product;
}
}
(4)创建指挥者对象,提供 build()
方法用于构建产品,其中按照一定顺序调用具体建造者生产各个组成部分的方法,最终返回目标产品:
public class Director {
public Product build(Builder builder) {
builder.buildA();
builder.buildB();
builder.buildC();
builder.buildD();
return builder.getProduct();
}
}
(5)客户端中通过指挥者以及具体的建造者来构造复杂对象:
public class Client {
public static void main(String[] args) {
Product product = new Director().build(new Worker());
System.out.println(product);
}
}
(6)程序的运行结果如下:
生产汉堡
生产可乐
生产薯条
生产甜点
Product{buildA='生产汉堡', buildB='生产可乐', buildC='生产薯条', buildD='生产甜点'}
3. 与抽象工厂模式的区别
- 抽象工厂模式得到的是一个产品族的多个产品,而建造者模式得到的是一个复杂的对象。
- 建造者模式更加关注复杂对象各个部分的组装过程。可以将抽象工厂理解为生产汽车的各个不同类型的汽车配件,将建造者理解为汽车的组装工厂,能够按照一定顺序将各个配件组装成汽车。