文章目录
前言
文章内容主要参考了刘伟主编的《设计模式(第2版)》,以及自己学校华师大软院ppt的内容总结,同时也结合了自己的一些思考和理解,希望能帮到大家。
本篇文章讲解的是建造者模式。
正文
一、定义
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。
在这模式中,客户不需要知道复杂对象的内部组成和装配方式,只需要知道建造者的类型即可,同时,复杂对象的构建和组装会分隔开来,建造者可以定义不同的创建类型。
二、情景假设
利用建造者模式描述KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。
老规矩,在看代码前我们可以自己脑补你会怎么编写?是不是开始模仿工厂方法模式,具体工厂实现类提供一个build方法创建并返回复杂对象?接下来核对自己的想法叭。
三、情景分析
关于上面情景的类图(具体分析在下面)
首先肯定会有个Meal套餐类,和我们之前有个电视TV类一样,但因为它是个复杂对象,里面有大量的属性(而且其实和可能是其他各种类),然后配备了getter和setter方法。还有不同的是这个meal尽管创建出来也是个空的,它其实更像是一个空的躯壳,而不像之前的工厂方法模式中每个TV都会有个具体实现TV类。meal的填充交由给了建造者进行填充,而不是自己去实现,同时我们也要考虑创建过程的自定义问题。所以设置只有一个空壳的Meal类。(其实有抽象类TV的味道)
//产品类Meal(套餐类)
public class Meal
{
private String food;
private String drink;
public setter...
public getter...
}
接下来就是需要有一个Meal的填充实现类,也就是建造者类去构建填充产品Meal,先定义一个抽象类,之后再具体实现各个建造者,一个具体的建造者相当于确定一个具体的产品类。(其实有点像是TV的抽象实现类ConcreteTV,只是拆分成了两部分)
//抽象类MealBuilder
public abstract class MealBuilder
{
protected Meal meal = new Meal();
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal(){
return meal;
}
}
//具体实现类
//SubMealBuilderA
public class SubMealBuilderA implements