建造者(Builder)模式的定義: 指將一個複雜物件的建構與它的表示分離,使同樣的建構過程可以創造不同的表示,這樣的設計模式被稱為建造者模式。它是將一個複雜的對象分解為多個簡單的對象,然後一步一步建構而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。
1、封裝性好,建構和表示分離。
2、擴展性好,各個特定的建造者相互獨立,有利於系統的解耦。
3、客戶端不必知道產品內部組成的細節,建造者可以對創建過程逐步細化,而不對其它模組產生任何影響,便於控制細節風險。
1、產品的組成部分必須相同,這限制了其使用範圍。
2、如果產品的內部變化複雜,如果產品內部發生變化,則建造者也要同步修改,後期維護成本較大。
建造者(Builder)模式和工廠模式的關注點不同:建造者模式註重零件的組裝過程,而工廠方法模式更注重零件的創建過程,但兩者可以結合使用。
案例:神醫豆豆煉丹
#產品角色(Product):丹藥
抽象建造者(Builder):抽象丹方
具體建造者(Concrete Builder):具體丹方
指揮者(Director):神醫豆豆
神醫豆豆煉製九轉仙丹和太虛化神丹
注意:為了省事這裡說的丹方內容只有丹藥名字和效果,並沒有材料之類的。
丹藥類聲明煉丹的名稱和效果兩個屬性
public class Dan { /* cailiao 丹药的名称 danhuo 丹药的效果*/ private String name; private String xiaoguo; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getXiaoguo() { return xiaoguo; } public void setXiaoguo(String xiaoguo) { this.xiaoguo = xiaoguo; } }
抽象類,新一個丹藥對象,聲明兩個抽象方法分別是給丹藥命名和賦予丹藥效果,還有一個生成丹藥的方法。
//抽象丹方 abstract class DanFang { Dan dan = new Dan(); public abstract void name(); public abstract void xiaoguo(); public Dan getDan() { return dan; } }
具體丹方類繼承丹方類,並且實作兩個抽象方法。
//九转仙丹丹方 public class JiuZhuan extends DanFang { @Override public void name() { dan.setName("九转仙丹"); } @Override public void xiaoguo() { dan.setXiaoguo("原地成仙"); } }
具體丹方類繼承丹方類,並且實作兩個抽象方法。
//太虚化神丹丹方 public class Taixu extends DanFang { @Override public void name() { dan.setName("太虚化神丹"); } @Override public void xiaoguo() { dan.setXiaoguo("意念化神"); } }
聲明一個丹方屬性,一個有參構造方法,一個煉丹方法。
public class DouDou { private final DanFang danLu; public DouDou(DanFang danLu) { this.danLu = danLu; } //炼丹方法 public Dan lian() { //放入材料 danLu.name(); //释放丹火 danLu.xiaoguo(); //成丹 return danLu.getDan(); } }
煉製兩個丹藥。
public class Demo { public static void main(String[] args) { //炼制九转仙丹 //new一个九转仙丹的丹方 DanFang jiu = new JiuZhuan(); //把丹方给豆豆 DouDou dou = new DouDou(jiu); //炼丹生成丹药 Dan dan = dou.lian(); System.out.printf("丹药名称:%s 丹药效果:%s", dan.getName(), dan.getXiaoguo()); System.out.println(); //炼制太虚化神丹 //new一个九转仙丹的丹方 DanFang tai = new Taixu(); //把丹方给豆豆 DouDou dous = new DouDou(tai); //炼丹生成丹药 Dan dans = dous.lian(); System.out.printf("丹药名称:%s 丹药效果:%s", dans.getName(), dans.getXiaoguo()); } }
以上是分析Java中建造者模式的案例的詳細內容。更多資訊請關注PHP中文網其他相關文章!