建造者模式

建造者模式能夠將部件和其組裝過程分開,一步一步建立一個複雜的對象。用戶只須要指定複雜對象的類型就能夠獲得該對象,而無須知道其內部的具體構造細節.html

 

建造者模式(Builder Pattern) 又名生成器模式,是一種對象構建模式。它能夠將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不一樣實現方法能夠構造出不一樣表現(屬性)的對象。ide

建造者模式 是一步一步建立一個複雜的對象,它容許用戶只經過指定複雜對象的類型和內容就能夠構建它們,用戶不須要知道內部的具體構建細節。測試

 

抽象工廠模式實現對產品家族的建立,一個產品家族是這樣的一系列產品:具備不一樣分類維度的產品組合,採用抽象工廠模式不須要關心構建過程,只關心什麼產品由什麼工廠生產便可;ui

而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是經過組裝零配件而產生一個新產品spa

 

 

建造者模式的UML結構圖code

 

 

 

 

Product(產品角色): 一個具體的產品對象。htm

Builder(抽象建造者): 建立一個Product對象的各個部件指定的抽象接口。對象

ConcreteBuilder(具體建造者): 實現抽象接口,構建和裝配各個部件。blog

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的@Builderhttp://www.javashuo.com/article/p-zbovgucy-dx.html

 

 

 

參考:

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

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息