建造者模式能夠將部件和其組裝過程分開,一步一步建立一個複雜的對象。用戶只須要指定複雜對象的類型就能夠獲得該對象,而無須知道其內部的具體構造細節.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的@Builder:http://www.javashuo.com/article/p-zbovgucy-dx.html
參考: