設計模式(Java隨筆)—生成器模式
阿新 • • 發佈:2018-12-14
生成器模式(Builder Pattern):分離構建演算法和具體的構造實現,從而使構建演算法可以重用
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
將一個複雜物件的構建與它的表示分離,使同樣的構建過程可以建立不同的表示。
生成器模式將物件的構造過程封裝在具體的生成器中,使用者使用不同的具體生成器就可以得到該物件的不同表示。
當增加新的具體的生成器是,不必修改指揮者的程式碼,即該模式滿足開-閉原則。
角色:
- 產品類(Product)——實類,指定產品的結構或生產步驟
- 抽象生成器(Abstract Builder)——抽象類,定義子類在完成具體產品結構時必須要實現的方法
- 具體生成器(Concreat Builder)——實類,具體一種產品的實現
- 指導類(Director)——與使用者直接互動的類,通過此類可以生產出不同的產品
列子:感冒藥都應該具有配方,但不同藥品的配方的組成成分又不相同。藥品生產的結構就滿足生成器模式
import java.util.ArrayList; import java.util.List; public class BuilderModel { /** * 創造者模式(生成器模式) */ public static void main(String[] args) { // TODO Auto-generated method stub DrugDirector director=new DrugDirector(); DrugBuilder builder; builder=new Builder999(); director.construct(builder); builder=new BuilderGanKang(); director.construct(builder); } } // 藥品配方類 class Drug { private String drugName; public Drug(String drugName) { this.drugName = drugName; } ///輸出藥物名字 public String getDrugName() { return drugName; } private List<String> list = new ArrayList<String>(); //添加藥物成分 public void addSub(String dSub) { list.add(dSub); } //輸出藥物成分 public String getSub() { String temp =""; for(String s:list){ temp+=(s+" "); } return temp; } } //藥品生成器介面 interface DrugBuilder{ //定義子類必須實現的兩個方法(添加藥物成分和顯示藥物成分) public void builderSub(); public void showDrug(); } //藥品1 class Builder999 implements DrugBuilder{ Drug drug=new Drug("999感冒靈"); @Override public void builderSub() { drug.addSub("麻黃"); drug.addSub("葛根"); drug.addSub("桂枝"); drug.addSub("糊精"); drug.addSub("苦杏仁"); drug.addSub("陳皮"); } @Override public void showDrug() { System.out.println("藥品名稱:"+drug.getDrugName()); System.out.println("組成成分:"+drug.getSub()); } } //藥品2 class BuilderGanKang implements DrugBuilder{ Drug drug=new Drug("感康"); @Override public void builderSub() { drug.addSub("對乙醯氨基酚"); drug.addSub("鹽酸金剛烷胺"); drug.addSub("咖啡因"); drug.addSub("人工牛黃"); drug.addSub("馬來酸氯苯那敏"); } @Override public void showDrug() { System.out.println("藥品名稱:"+drug.getDrugName()); System.out.println("組成成分:"+drug.getSub()); } } //指揮類(制定藥品的種類) class DrugDirector{ //在這裡指揮類的作用只是顯示藥品資訊,需要傳入藥品物件表明是何種藥品的資訊 public void construct(DrugBuilder builder){ builder.builderSub(); builder.showDrug(); } }
程式輸出:
藥品名稱:999感冒靈
組成成分:麻黃 葛根 桂枝 糊精 苦杏仁 陳皮
藥品名稱:感康
組成成分:對乙醯氨基酚 鹽酸金剛烷胺 咖啡因 人工牛黃 馬來酸氯苯那敏
參考書籍:《大話設計模式》,《設計模式(Java版)》