关注微信公众号:程序驴,获取更多学习资料

何为建造者模式

建造者模式一般用于构建一个由多个简单对象构成的复杂对象。比如一台完整的汽车对象,其中可能需要:

  • 车体框架对象
  • 车门对象
  • 车窗对象
  • 发动机对象
  • ……

其实不同的汽车品牌,他用到的某个部件可能是来自不同的厂家,但是汽车的构造过程是大差不差的,也就是同样的构造模式可以创建不同的对象。如果构造汽车这一过程完全由人操控,在程序中体现就是你需要写很多的set方法(例如下面这样)

1
2
3
4
5
Car mycar = new Car();
mycar.setBody("钛合金进口车架");
mycar.setDoor("防弹车门");
mycar.setEngine("双瓦轮增压发动机")
// ............

最终才能得到一种汽车,而建造者模式简化了这一过程,建造者模式对某一种特定的复杂对象提供了专门构造他的Builder方法,该Builder方法类似于将所有set方法进行了单独的封装,使得Builder方法最终可以直接提供出我们需要的那一种汽车,比如下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public Class mycarBuilder extends carBuilder{
public void buildBody(){
mycar.setBody("钛合金进口车架");
}

public void buildDoor(){
mycar.setDoor("防弹车门");
}

public void buildEngine(){
mycar.setEngine("双瓦轮增压发动机")
}

public Car getCar(){
return mycar;
}
}

实战案例

汽车对我们有点遥远,我们拿平时吃快餐这件事做例子:快餐店通常会提供多种多样的套餐,一份套餐通常会包含主食、小吃、饮品,算是一个复杂对象,不同的食物搭配组成不同的套餐。

套餐类

image-20240524171408663

偷懒直接用String了,实际还应该设计主食类,小吃类,饮品类等。

套餐构建抽象类

image-20240524171552919

A套餐Builder

image-20240524171636367

B套餐Builder

image-20240524171727737

两种建造者会直接返回对应的套餐类型

套餐指挥类

image-20240524171900267

通过传入的建造者类型,获得对应对象。

BuilderMain

image-20240524172002094

运行结果

image-20240524172023450