標籤:

創建型模式之建造者模式

創建型模式之建造者模式

定義

  • 建造者模式(Builder Pattern):將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式是一種對象創建型模式。
  • 簡單說,建造者的功能就是先構造複雜對象的每一個部件,指揮者的功能就是將這些部件以一定的步驟組裝起來,形成一個具有一定功能的產品或者對象。當然這個步驟是透明的對於客戶端。
  • 建造者模式一步一步創建一個複雜的對象,它允許用戶只通過指定複雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。建造者模式結構如圖8-2所示:

實例

  • 下面是一個組裝汽車的例子,其中汽車由發動機和輪胎組成,那麼我們只需要組裝輪胎,發動機即可組裝完成一個汽車。
  • 汽車包括輪胎,引擎,我們通常在組裝汽車的時候一般都是一步一步的組裝,比如先裝引擎,後裝輪胎。使用建造者模式就是將建造汽車的這個過程抽離成幾個不同的過程,比如建造引擎和建造輪胎就是兩個過程。
  • 輪胎的JavaBean

/* * 輪胎 */class Tyre { private String name; public Tyre(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; }}

  • 引擎的JavaBean

/* * 引擎 */class Engine { private String name; public Engine(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; }}

  • 汽車的JavaBean(汽車包含輪胎和引擎,因此使用聚合的關係)

/* * 汽車的類 */public class Car { private Tyre tyre; // 輪胎 private Engine engine; // 引擎 public Tyre getTyre() { return tyre; } public void setTyre(Tyre tyre) { this.tyre = tyre; } public Engine getEngine() { return engine; } public void setEngine(Engine engine) { this.engine = engine; }}

  • 抽象建造者(實際上是一個介面,其中定義了建造輪胎和引擎的方法)

public interface Builder { /** * 構造引擎的方法 */ Engine buliderEngine(); /** * 構造輪胎的方法 */ Tyre builderTyre();}

  • 具體的建造者(實現了抽象建造者,實現建造輪胎和引擎的詳細過程)

/* * 具體的建造者,主要是構造汽車的部件 */public class BuilderCar implements Builder { @Override public Engine buliderEngine() { System.out.println("構造汽車發動機"); return new Engine("傻逼牌發動機"); } @Override public Tyre builderTyre() { System.out.println("構造汽車輪胎"); return new Tyre("傻逼牌輪胎"); }}

  • 抽象指揮者(定義了一個構造汽車的方法),指揮者的作用就是按照一定步驟將構造者建造的部件組裝起來

/* * 指揮者的介面,用來按照順序組裝汽車 */public interface Director { Car CreateCar();}

  • 具體的指揮者(實現了指揮者介面)

/* * 指揮者的實現類 */public class DirectorCar implements Director { private Builder builder; // 建造者的對象 /** * 構造方法,主要用來初始化建造者對象 * * @param builder Builder的對象 */ public DirectorCar(Builder builder) { this.builder = builder; } @Override public Car CreateCar() { Car car = new Car(); // 創建汽車對象 Engine engine = builder.buliderEngine(); // 構建發動機 Tyre tyre = builder.builderTyre(); // 構造輪胎 car.setEngine(engine); // 設置屬性 car.setTyre(tyre); // 設置屬性 return car; // 返回構造好的汽車 }}

  • 測試類

public class Client { public static void main(String[] args) { Director director = new DirectorCar(new BuilderCar()); // 創建指揮者的對象 Car car = director.CreateCar(); // 獲取組裝完成的 System.out.println(car.getEngine().getName()); // 輸出引擎的名字 System.out.println(car.getTyre().getName()); // 輸出輪胎的名字 }}

適用場景

  • 基本部件不變,但是其中的組合經常變化的情況
    • 比如你去肯德基點餐,漢堡,可樂,雞翅這些食物是不變的,但是套餐的組合是經常變化的,建造者模式的指揮者就是將這些部件按照一定步驟將其組合起來的。
    • java中StringBuilder
  • 需要生成的對象具有複雜的內部結構
    • 複雜的內部結構,我們可以使用建造者模式將其分離,先將其中的各個小的部件組裝成功,然後由指揮者按照一定的步驟將其組裝成一個複雜的對象
  • 需要生成的對象內部屬性本身相互依賴。

推薦閱讀:

遊戲開發與程序設計知識總結01——設計模式
設計模式之「Decorator」註疏#02
類的設計原則
面向新手的雜談:Flyweight(續)
面向對象&設計模式

TAG:設計模式 |