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

Java 建造者模式深度解析:將複雜對象構建與表示分離

     編輯:Java 程式設計入門

引子:裝機工的啟示

陪朋友去裝機店攢電腦,看裝機工熟練組裝:不管 CPU 是 Intel 還是 AMD,顯卡貴賤,都能裝出電腦。客戶也不懂組裝細節。這簡直就是建造者模式!

定義與核心精神

GoF 定義:將複雜對象構建與其表示分離,使相同構建過程可創建不同表示。精髓:將構造複雜對象的過程與對象部件解耦,貫徹降低耦合、提高復用精神——這貫穿 GoF 幾乎所有模式。

適用場景

滿足以下條件考慮使用:

  • 產品有複雜內部結構,由多個對象組成
  • 系統未來可能改變產品內部結構組成或實現方式(如屬性來源從 DB 變為 XML 解析)
  • 不能將產品內部構造完全暴露給客戶端(可用性、安全性)

四大角色

  1. 抽象建造者:規範產品各組成部分建造步驟,獨立於業務邏輯
  2. 具體建造者:與業務緊密相關,在指導者調用下創建產品實例,實現抽象建造者方法,完成組裝並提供成品
  3. 指導者:調用具體建造者創建產品,無產品具體知識(知識在具體建造者)
  4. 產品角色:構建中的複雜對象,包含定義組件的類與裝配接口

流程:客戶端創建指導者與建造者,將建造者傳入指導者配置 → 指導者按步驟調用建造者方法創建產品 → 客戶端從建造者或指導者獲取產品。

關鍵差異:建造模式將產品組裝「外部化」到建造者角色,而工廠模式產品創建在產品類內部完成。

實戰範例:多媒體內容構建

媒體有不同表達形式:書籍、雜誌、網站。構建步驟相似,提取到指導者。

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);
    }
}

建造者 vs 抽象工廠

兩者相似但關注點不同:

  • 建造者:關注「一步步構建複雜對象」,強調構建過程與順序
  • 抽象工廠:關注「創建一族相關/依賴對象」,強調產品族

建造者常用於參數眾多、構建邏輯複雜的物件(如 StringBuilder、HttpClient 配置、複雜報表生成)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved