將一個複雜的對象創建與它的表示分離,是的同樣的構建過程可以創建不同的表示。
通用類圖如下:
建造模式中主要有如下四個角色:
Prodct產品類:
產品便是建造中的複雜對象
抽象建造者:
給出一個或多個抽象接口,規範產品的組件,有子類實現具體組建方法
具體建造者:
通常是實現了抽象建造者的方法,並且返回一個組建好的對象
Director導演類:
負責安排已有的模塊順序,然後告訴建造者開始建造
/** * * 產品類 * */ public class Product { }
/** * 抽象建造者 */ public abstract class AbstractBuilder { // 規範組建邏輯 protected abstract void bulidPart(); // 返回建造好的產品 protected abstract Product createProduct(); }
/** * 具體的建造者 * */ public class ConcreteBuilder extends AbstractBuilder { /** * * @see com.huashao.chapter.chapter11.AbstractBuilder#bulidPart() */ @Override protected void bulidPart() { // TODO Auto-generated method stub } /** * @return * @see com.huashao.chapter.chapter11.AbstractBuilder#createProduct() */ @Override protected Product createProduct() { // TODO Auto-generated method stub return new Product(); } }
/** * * 導演類 * */ public class Director { private AbstractBuilder builder = new ConcreteBuilder(); public Product buildProduct() { builder.bulidPart(); return builder.createProduct(); } }
建造者模式的使用場景:
1.相同的方法不同的執行順序,產生不同的結果是可以使用建造者模式
2.多個部件或零件,都可以組裝到一個對象中,但是產生的運行結果不相同
2.產品類非常複雜或者產品類中的調用順序不同產生了不同的效果
建造者模式的應用:
小明留級了N年後終於考上大學了,小明報考了計算機專業,因爲這個專業可以打Dota,小明跟爸爸說,計算機專業沒有電腦不行(多麼合理的理由啊),小明爸爸就給了小明5000塊錢,小明拿着錢去電子城轉了一圈發現如果買現成的電腦都在5000元以上,小明跟爸爸說現在5000塊錢買不了電腦,小明爸爸說:滾!這下可把小明愁壞了,舍友看到小明在唉聲嘆氣就問發生什麼事,小明就把情況更舍友說了一下,舍友說:你可以組裝一臺電腦啊,我這就要去電子城組裝電腦,一起去吧。小明和舍友想電子城飛奔而去........下面上類圖
電腦主要評價指標:CPU,硬盤、顯示器、內存
/** * * 電腦 * */ public class Computer { private String cpu; // 硬盤 private String disk; // 內存 private String memory; // 顯示器 private String display; public Computer() { } /** * @param cpu * @param disk * @param memory * @param display */ public Computer(String cpu, String disk, String memory, String display) { this.cpu = cpu; this.disk = disk; this.memory = memory; this.display = display; } public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getDisk() { return disk; } public void setDisk(String disk) { this.disk = disk; } public String getMemory() { return memory; } public void setMemory(String memory) { this.memory = memory; } public String getDisplay() { return display; } public void setDisplay(String display) { this.display = display; } }
/** * 組裝電腦的抽象類 * */ public abstract class BuliderPC { protected Computer computer; // 選擇CPU的品牌 protected abstract void bulidCpu(String cpu); // 組裝顯示器,輸入顯示器的品牌 protected abstract void bulidDisplay(String display); // 組裝內存條 protected abstract void bulidMemory(String memory); // 組裝硬盤 protected abstract void bulidDisk(String disk); // 組裝電腦 protected abstract Computer bulidComputer(); }
/** * * */ public class ConcreteBulidPc extends BuliderPC { public ConcreteBulidPc() { computer = new Computer(); } /** * @param cpu */ @Override protected void bulidCpu(String cpu) { computer.setCpu(cpu); } /** * @param display */ @Override protected void bulidDisplay(String display) { computer.setDisplay(display); } /** * @param memory */ @Override protected void bulidMemory(String memory) { computer.setMemory(memory); } /** * @param disk */ @Override protected void bulidDisk(String disk) { computer.setDisk(disk); } /** * @return */ @Override protected Computer bulidComputer() { // TODO Auto-generated method stub return computer; } }
/** * * 導演類 * */ public class Director { private BuliderPC bulider; public Director() { bulider = new ConcreteBulidPc(); } public Computer bulidComputer(String cpu, String disk, String memory, String display) { bulider.bulidCpu(cpu); bulider.bulidDisk(disk); bulider.bulidMemory(memory); bulider.bulidDisplay(display); return bulider.bulidComputer(); } }
小明和舍友到達電子城,小明跟組裝電腦的老闆說:老闆給你5000塊錢給我組裝個蘋果電腦....老闆說:你是小明吧?我從小就看你的笑話....
public class Client { public static void main(String[] args) { Director director=new Director(); Computer xiaoming=director.bulidComputer("Apple", "xxx", "xxx", "apple retina"); Computer sheyou=director.bulidComputer("sony", "xxxx", "xxx", "samsung"); } }
其實組裝電腦這件事用建造者感覺有點不合適,因爲我們完全可以new一個電腦然後挨個賦值