首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

建造者模式深度解析:組裝複雜物件的藝術

     編輯:Java 相關知識

建造者模式將「複雜物件的構建過程」與「表示/部件」分離,使相同構建流程可產出不同表示。本文以組裝電腦、媒體出版為例,完整展示角色、代碼、優勢與擴充。

一、模式動機

  • 產品內部結構複雜 (多部件、多步驟)。
  • 構建算法應獨立於部件創建細節。
  • 需支援多種表示 (如:筆電/桌機/伺服器;書/雜誌/網站)。
  • 客戶端不應暴露組裝細節。

二、四大角色

角色職責對應範例
Director (指導者)定義構建步驟順序,調用 Builder 方法裝機工程師、MediaDirector
Builder (抽象建造者)聲明構建部件的抽象介面MediaBuilder
ConcreteBuilder (具體建造者)實作部件創建與組裝,提供成品BookBuilder、PCBuilder
Product (產品)複雜物件,含部件與組裝介面Book、Computer

三、類圖關係

Client → Director → Builder ← ConcreteBuilder → Product
                  ↑
              構建步驟序列

四、媒體出版完整代碼

// 產品層級
class Media extends ArrayList {}
class Book extends Media {}
class Magazine extends Media {}
class WebSite extends Media {}

// 部件
class MediaItem { String s; MediaItem(String s){this.s=s;} }
class Chapter extends MediaItem { Chapter(String s){super(s);} }
class Article extends MediaItem { Article(String s){super(s);} }
class WebItem extends MediaItem { WebItem(String s){super(s);} }

// 抽象建造者
abstract class MediaBuilder {
    abstract void buildBase();
    abstract void addMediaItem(MediaItem item);
    abstract Media getFinishedMedia();
}

// 具體建造者
class BookBuilder extends MediaBuilder {
    Book b;
    void buildBase() { System.out.println("Building book framework"); b=new Book(); }
    void addMediaItem(MediaItem c) { System.out.println("Adding chapter "+c); b.add(c); }
    Media getFinishedMedia() { return b; }
}
class MagazineBuilder extends MediaBuilder { /* 類似 */ }
class WebSiteBuilder extends MediaBuilder { /* 類似 */ }

// 指導者
class MediaDirector {
    MediaBuilder mb;
    MediaDirector(MediaBuilder mb) { this.mb = mb; } // 策略模式注入
    Media produceMedia(List input) {
        mb.buildBase();
        for (MediaItem item : input) mb.addMediaItem(item);
        return mb.getFinishedMedia();
    }
}

// 客戶端測試
List input = Arrays.asList(new Chapter("Ch1"), new Chapter("Ch2"));
Media book = new MediaDirector(new BookBuilder()).produceMedia(input);
System.out.println(book); // [Ch1, Ch2]

五、實作關鍵點

  • Builder 介面需足夠通用,無關步驟可空實作。
  • 產品間無共同基類時,可用標記介面或移除 getFinishedMedia() 回傳 Object。
  • Director 組裝邏輯固化,Builder 實現變化,符合開閉原則。

六、優勢總結

  1. 封裝構建細節,客戶端只需指定 Builder 類型。
  2. 新增表示只需新增 ConcreteBuilder,不修改 Director/Client。
  3. 比工廠方法更精細控制構建過程 (步驟可攔截、日誌、驗證)。
  4. 各 Builder 互不相干,並行開發無衝突。

七、擴充組合

  • 部件創建可用 工廠方法 或 原型模式。
  • 部件結構樹狀時結合 組合模式。
  • 控制 Builder 實例數量可用 單例。
  • 與抽象工廠區別:Builder 產出單一複雜產品;抽象工廠產出相關產品族。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved