建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节.
建造者模式(Builder Pattern) 又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可;
而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。
建造者模式的UML结构图
Product(产品角色): 一个具体的产品对象。
Builder(抽象建造者): 创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder(具体建造者): 实现抽象接口,构建和装配各个部件。
Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
KFC套餐例子
/** * 产品角色 * 一种套餐:有食品名称和饮料两种属性 */ @Data public class Meal { private String food; private String drink; }
/** * 抽象建造者 * 组合了产品(套餐) * 制造食品和饮料 * get产品 */ @Getter public abstract class MealBuilder { Meal meal = new Meal(); public abstract void buildFood(); public abstract void buildDrink(); }
/** * 套餐A */ public class MealA extends MealBuilder { @Override public void buildFood() { meal.setFood("薯条"); } @Override public void buildDrink() { meal.setDrink("甜茶"); } }
/** * 套餐B */ public class MealB extends MealBuilder { @Override public void buildFood() { meal.setFood("鸡腿"); } @Override public void buildDrink() { meal.setDrink("泸州老窖百调星座预调酒"); } }
/** * 指挥官 * 作用是利用建造者将各个部分(属性)的建造走一条流水线 * 这里是套餐的两个属性食品和饮料 * 如果没有指挥官(核心方法Constructor)方法,客户端构建一个Meal对象时就需要自己明白构建过程(buildFood,buildDrink...) */ @AllArgsConstructor public class Director { private MealBuilder mealBuilder; /** * 制造一种套餐 * @return */ public Meal constructor(){ mealBuilder.buildFood(); mealBuilder.buildDrink(); return mealBuilder.getMeal(); } }
/** * 建造者模式测试 */ public class MainTest { @Test public void testBulider(){ //B套餐建造者 MealB mealB = new MealB(); //指挥官得到的菜单是套餐B Director director = new Director(mealB); //指挥官利用建造者流水线创造一个产品套餐 Meal meal = director.constructor(); System.out.println(meal.toString()); } }
建造者模式的一个变种
lombok的@Builder:https://www.cnblogs.com/theRhyme/p/10181103.html
参考: