建造者模式又称生成器模式,所属创建型设计模式,它提供了一种最佳的创建对象方式,将多个简单的对象一步一步构建成一个复杂的对象。对于用户而言,无需知道创建过程和内部组成细节,只需直接使用创建好的对象即可。
建造者模式结构较为复杂,它除了包含建造者类之外,还包含一个指挥者类。
包含角色如下 👇
抽象建造者为创建一个产品 Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是 buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。它既可以是抽象类,也可以是接口。
具体建造者实现了Builder接口,实现各个部件的构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
产品角色是被构建的复杂对象,包含多个组成部件﹐具体建造者创建该产品的内部表示并定义它的装配过程。
指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。
说明:建造者模式可以用于描述KFC如何创建套餐,套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁,可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。
套餐类Meal是复杂产品对象﹐它包括两个成员属性food 和 drink,其中 food表示主食,drink 表示饮料,在 Meal中还包含成员属性的Getter方法和Setter方法。
MealBuilder是套餐建造者,它是一个抽象类,声明了抽象的部件组装方法 buildFood()和 buildDrink(),在 MealBuilder 中定义了Meal类型的对象meal,提供了工厂方法 getMeal()用于返回meal对象。
SubMealBuilderA是具体建造者类,它用于创建A套餐,它是抽象建造者类的子类,实现了在抽象建造者中声明的部件组装方法,该套餐由一个鸡腿堡与一杯可乐组成。
SubMealBuilderB也是具体建造者类,它用于创建B套餐,该套餐由一个鸡肉卷与一杯果汁组成。
KFCWaiter类是指挥者类,在KFC套餐制作过程中,它就是KFC的服务员。在其中定义了一个抽象建造者类型的变量mb,具体建造者类型由客户端指定,在其construct()方法中调用mb对象的部件组装方法和工厂方法,用于向客户端返回-份包含主食和饮料的完整套餐。
在客户端测试类中,通过new具体建造者类的类名可以获得一个具体建造者对象mb,然后将其传入指挥者类KFCWaiter的对象 waiter 中,通过 waiter 的construct()方法来调用套餐的组成方法并返回套餐给客户端。
如果要更换套餐我们只需要更换具体的建造者无需更改源码,如果需要增加一个新的套餐,只需要继承抽象建造者类,再实现在其中声明的抽象部件组装方法,即可使用新的具体建造者构造新的类型的套餐。
建造者模式和之前文章所讲的工厂模式有何区别 ❓
好了到此建造者就总结完毕了,如果有幸帮到你还请一键三连加个关注~ 感谢!
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45692705/article/details/121136357
内容来源于网络,如有侵权,请联系作者删除!