陪朋友去裝機店攢電腦,看裝機工熟練組裝:不管 CPU 是 Intel 還是 AMD,顯卡貴賤,都能裝出電腦。客戶也不懂組裝細節。這簡直就是建造者模式!
GoF 定義:將複雜對象構建與其表示分離,使相同構建過程可創建不同表示。精髓:將構造複雜對象的過程與對象部件解耦,貫徹降低耦合、提高復用精神——這貫穿 GoF 幾乎所有模式。
滿足以下條件考慮使用:
流程:客戶端創建指導者與建造者,將建造者傳入指導者配置 → 指導者按步驟調用建造者方法創建產品 → 客戶端從建造者或指導者獲取產品。
關鍵差異:建造模式將產品組裝「外部化」到建造者角色,而工廠模式產品創建在產品類內部完成。
媒體有不同表達形式:書籍、雜誌、網站。構建步驟相似,提取到指導者。
import java.util.*;
import junit.framework.*;
// 不同媒體形式
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;} public String toString(){return 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);} }
// 抽象建造者:規範所有媒體建造步驟
class MediaBuilder {
public void buildBase() {}
public void addMediaItem(MediaItem item) {}
public Media getFinishedMedia() { return null; }
}
// 具體建造者:書籍建造者
class BookBuilder extends MediaBuilder {
private Book book = new Book();
public void buildBase() { book.add(new Chapter("Preface")); }
public void addMediaItem(MediaItem item) { book.add(item); }
public Media getFinishedMedia() { return book; }
}
// 指導者:控制構建流程
class Director {
public void construct(MediaBuilder builder) {
builder.buildBase();
builder.addMediaItem(new Chapter("Chapter 1"));
builder.addMediaItem(new Chapter("Chapter 2"));
}
}
// 客戶端使用
public class Client {
public static void main(String[] args) {
Director director = new Director();
BookBuilder builder = new BookBuilder();
director.construct(builder);
Book book = (Book) builder.getFinishedMedia();
System.out.println(book);
}
}
兩者相似但關注點不同:
建造者常用於參數眾多、構建邏輯複雜的物件(如 StringBuilder、HttpClient 配置、複雜報表生成)。