建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节.

 

建造者模式(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的@Builderhttps://www.cnblogs.com/theRhyme/p/10181103.html

 

 

 

参考:

https://www.cnblogs.com/snailclimb/p/builderpattern.html