模式简介
建造者模式又称生成器模式,所属创建型设计模式,它提供了一种最佳的创建对象方式,将多个简单的对象一步一步构建成一个复杂的对象。对于用户而言,无需知道创建过程和内部组成细节,只需直接使用创建好的对象即可。
结构定义
建造者模式结构较为复杂,它除了包含建造者类之外,还包含一个指挥者类。
包含角色如下 👇
- Builder(抽象建造者)
抽象建造者为创建一个产品 Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是 buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。它既可以是抽象类,也可以是接口。
- ConcreteBuilder(具体建造者)
具体建造者实现了Builder接口,实现各个部件的构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
- Product(产品角色)
产品角色是被构建的复杂对象,包含多个组成部件﹐具体建造者创建该产品的内部表示并定义它的装配过程。
- Director(指挥者)
指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。
模式案例
- 下面通过KFC套餐实例来进一步学习并理解建造者模式。
说明:建造者模式可以用于描述KFC如何创建套餐,套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁,可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。
- 产品类 Meal(套餐类)
套餐类Meal是复杂产品对象﹐它包括两个成员属性food 和 drink,其中 food表示主食,drink 表示饮料,在 Meal中还包含成员属性的Getter方法和Setter方法。
- 抽象建造者类 MealBuilder(套餐建造者类)
MealBuilder是套餐建造者,它是一个抽象类,声明了抽象的部件组装方法 buildFood()和 buildDrink(),在 MealBuilder 中定义了Meal类型的对象meal,提供了工厂方法 getMeal()用于返回meal对象。
- 具体建造者类 SubMealBuilderA(A 套餐建造者类)
SubMealBuilderA是具体建造者类,它用于创建A套餐,它是抽象建造者类的子类,实现了在抽象建造者中声明的部件组装方法,该套餐由一个鸡腿堡与一杯可乐组成。
- 具体建造者类SubMealBuilderB(B套餐建造者类)
SubMealBuilderB也是具体建造者类,它用于创建B套餐,该套餐由一个鸡肉卷与一杯果汁组成。
- 指挥者类 KFCWaiter(服务员类)
KFCWaiter类是指挥者类,在KFC套餐制作过程中,它就是KFC的服务员。在其中定义了一个抽象建造者类型的变量mb,具体建造者类型由客户端指定,在其construct()方法中调用mb对象的部件组装方法和工厂方法,用于向客户端返回-份包含主食和饮料的完整套餐。
- 客户端测试类 Client
在客户端测试类中,通过new具体建造者类的类名可以获得一个具体建造者对象mb,然后将其传入指挥者类KFCWaiter的对象 waiter 中,通过 waiter 的construct()方法来调用套餐的组成方法并返回套餐给客户端。
如果要更换套餐我们只需要更换具体的建造者无需更改源码,如果需要增加一个新的套餐,只需要继承抽象建造者类,再实现在其中声明的抽象部件组装方法,即可使用新的具体建造者构造新的类型的套餐。
模式总结
建造者模式的主要优点在于客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象,每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,符合“开闭原则”,还可以更加精细地控制产品的创建过程。
其主要缺点是由于建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,因此其使用范围受到一定的限制,如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
建造者模式和之前文章所讲的工厂模式有何区别 ❓
- 工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。
- 建造者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节,组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品。
好了到此建造者就总结完毕了,如果有幸帮到你还请一键三连加个关注~ 感谢!