建造者模式將「複雜物件的構建過程」與「表示/部件」分離,使相同構建流程可產出不同表示。本文以組裝電腦、媒體出版為例,完整展示角色、代碼、優勢與擴充。
| 角色 | 職責 | 對應範例 |
|---|---|---|
| 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]
getFinishedMedia() 回傳 Object。