建造者模式(Builder Pattern)
阿新 • • 發佈:2017-12-18
pub 圖片 imp 客戶端 問題 復雜 override 適合 type 定義:
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示
解決的問題:
- 方便用戶創建復雜的對象(不需要知道實現過程)
- 代碼復用性 & 封裝性(將對象構建過程和細節進行封裝 & 復用)
- Builder:抽象建造者。為創建一個產品對象的各個部件指定抽象接口
- ConcreteBuilder:具體建造者。實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並提供一個檢索產品的接口
- Director:指揮者。構造一個使用Builder接口的對象,指導構建過程
- Product:產品角色
- 易於解耦。將產品本身與產品創建過程進行解耦,可以使用相同的創建過程來得到不同的產品。也就說細節依賴抽象
- 易於精確控制對象的創建。將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰
- 易於拓展。增加新的具體建造者無需修改原有類庫的代碼,易於拓展,符合“開閉原則“。 每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,用戶使用不同的具體建造者即可得到不同的產品對象。
缺點:
- 建造者模式所創建的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。
- 如果產品的內部變化復雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。
interface IBuilder { public void builderCPU(); public void builderMainboard(); public Computer getComputer(); }
定義具體建造者
class DellComputerBuilder implementsIBuilder { Computer c = new Computer(); @Override public void builderCPU() { c.setCpu("dell type"); } @Override public void builderMainboard() { c.setMainBoard("dell type"); } @Override public Computer getComputer() { return c; } }
定義指揮者
class Director { public void construct(IBuilder builder) { builder.builderCPU(); builder.builderMainboard(); } }
定義產品
class Computer { String cpu; String mainBoard; public void setCpu(String cpu) { this.cpu = cpu; } public void setMainBoard(String mainBoard) { this.mainBoard = mainBoard; } @Override public String toString() { return "im a computer , my cpu is " + cpu + ",my main board is " + mainBoard; } }
客戶端調用
public static void main(String[] args) { IBuilder builder = new DellComputerBuilder(); Director dt = new Director(); dt.construct(builder); Computer c = builder.getComputer(); System.out.println(c.toString()); }
輸出
建造者模式(Builder Pattern)