点击进入我的博客
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。它提供了一种创建对象的最佳方式。
2.6.1 建造者结构
![](https://img.haomeiwen.com/i14623831/6b18ee1a3305b9fe.png)
- Builder(抽象建造者):可以是一个抽象类或一个接口,规范产品对象的各个组成部分的建造。
- ConcreteBuilder(具体建造者):它实现了Builder接口,给出一步一步的创建产品实例的操作,然后提供一个方法返回创建好的复杂产品对象。
- Product(产品角色):如果是单个产品类,那么就是一个具体的产品;如果是多个产品类,那么就是一个抽象的类或接口。
- ConcreteProduct(具体产品):当多个产品类时,继承抽象Product,也就是具体的要建造的复杂对象。值得注意的是,这些产品类不一定会有共同的接口。
- Director(指挥者):它复杂安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在Director的方法中调用建造者对象的部件构造与装配方法,完成建造复杂对象的任务。
2.6.2 建造者模式细节
主要目的
一个产品通常有不同的组成成分作为产品的零件,不同的产品可以有不同的零件,建造产品的过程是建造零件的过程。建造者模式将产品的结构和产品的零件建造过程对外隐藏起来,把对建造过程进行指挥的责任和具体建造零件的责任分割开来,达到责任划分和封装的目的。
解决问题
主要解决在开发过程中,有时需要创建一个复杂对象,通常由多个部分的子对象构成;由于复杂对象的多样性,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法需要保持稳定。
使用场景
- 肯德基的产品很多,需要组成“套餐”。
- Java的StringBuilder
省略角色
- 省略抽象建造者:如果只需要一个具体建造者,则可以省略抽象建造者。
- 省略指挥者:可以在具体建造者里边直接构造具体产品。
- 合并具体建造者和具体产品:在产品本身就是自己的建造者。
优点
- 良好的封装性
- 具体建造类之间独立,扩展性好
缺点
- 如果产品比较多,可能会有很多的建造类。
2.6.3 肯德基套餐案例
public class Waiter {
public static void main(String[] args) {
KFCBuilder builder = new MexicanTwisterBuilder();
builder.buildBeverage();
builder.buildHamburger();
builder.buildSnack();
KFCCombo combo = builder.getCombo();
}
}
// 套餐接口
abstract class KFCCombo {
private String hamburger;
private String beverage;
private String snack;
// getters & setters
}
// 墨西哥鸡肉卷套餐
class MexicanTwisterCombo extends KFCCombo {}
// Builder接口
interface KFCBuilder {
void buildHamburger();
void buildBeverage();
void buildSnack();
KFCCombo getCombo();
}
class MexicanTwisterBuilder implements KFCBuilder {
private KFCCombo combo = new MexicanTwisterCombo();
@Override
public void buildHamburger() {
combo.setHamburger("Mexican Twister");
}
@Override
public void buildBeverage() {
combo.setBeverage("Pepsi Cola");
}
@Override
public void buildSnack() {
combo.setSnack("Hot Wings");
}
@Override
public KFCCombo getCombo() {
return combo;
}
}
2.6.4 builder内部类
如果一个类有很多属性,此时为此类写一个Builder内部类,来辅助建造该类。
class Phone {
private String screen;
private String camera;
private String cpu;
private String battery;
public static Builder builder() {
return new Builder();
}
public static class Builder {
private Phone phone = new Phone();
public Builder screen(String screen) {
phone.screen = screen;
return this;
}
public Builder camera(String camera) {
phone.camera = camera;
return this;
}
public Builder cpu(String cpu) {
phone.cpu = cpu;
return this;
}
public Builder battery(String battery) {
phone.battery = battery;
return this;
}
public Phone build() {
return phone;
}
}
}
2.6.5 与其他模式的关系
抽象工厂模式
- 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。
- 而建造者模式则是要求按照规定建造产品,它的主要目的是通过组装零配件而产生一个新产品。
- 换言之,抽象工厂模式在更加具体的维度上,而建造模式在一个更加宏观的维度上。
策略模式
- 事实上建造模式是策略模式的一种特殊情况,这两种模式的却别在于用意不同。
- 建造模式适应于为客户端一点一点地建造新的对象。
- 策略模式的目的是为算法提供抽象的接口。
网友评论