建造者模式 / 生成器模式


基本介紹

1.建造者模式,又叫生成器模式

2.將復雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不同實現方法可以構造出不同表現(屬性)的對象

 

事項

1.優點

(1)易於解耦:客戶端不需要知道內部的具體構建細節,將產品本身與創建過程進行解耦,允許用戶只通過指定復雜對象的類型和內容就構建對象,使用相同的創建過程來得到不同的產品,符合依賴倒轉原則

(2)易於精准控制對象的創建:將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰

(3)易於擴展:增加新的具體構建者無需修改原有的代碼,易於擴展,符合開閉原則

2.缺點

(1)建造者模式所創建的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,其使用范圍受到一定的限制

(2)如果產品的內部變化復雜,導致需要定義很多具體建造者類來實現這種變化,導致系統變得龐大

3.抽象工廠模式、建造者模式

(1)抽象工廠模式:實現對產品家族的創建,一個產品家族是一系列產品,具有不同分類維度的產品組合,采用抽象工廠模式不需要關心構建過程,只關心什么產品由什么工廠生產即可

(2)建造者模式:要求按照指定的規范建造產品,主要目的是通過組裝零配件而產生一個新產品

4.應用場景

(1)需要生成的產品對象有復雜的內部結構,這些產品對象具備共性

(2)隔離復雜對象的創建和使用,並使得相同的創建過程可以創建不同的產品

(3)需要生成的對象內部屬性本身相互依賴

 

四種角色

1.產品: 一個具體的產品對象

2.抽象建造者: 創建一個產品對象的各個部件指定的接口/抽象類

(1)規范具體建造者的方法

(2)是多個規范相同的具體建造者的抽象

3.具體建造者: 實現接口/繼承抽象類

(1)在規范下,實現具體的建造方法

(2)一個具體建造者對應一個具體產品

4.指揮者: 構建一個使用抽象建造者的對象

(1)隔離客戶端與產品對象的生產過程

(2)控制產品對象的生產流程

(3)所有具體建造者的生產流程一致

 

JDK 中的 StringBuilder

1.Appendable 接口定義了多個 append 方法(抽象方法), 即 Appendable 為抽象建造者, 定義了抽象方法

2. AbstractStringBuilder 實現了 Appendable 接口方法,AbstractStringBuilder 已經是具體建造者,但不能實例化

3.StringBuilder 即充當了指揮者,同時充當了具體建造者,因為 StringBuilder 繼承了 AbstractStringBuilder,建造方法的實現由 AbstractStringBuilder 完成

 

代碼示例

public class Builder {//客戶端

    public static void main(String[] args) {
        //創建指揮者
        Director director = new Director();
        //傳入具體建造者
        director.setAbstractBuilder(new ConcreteBuilder());
        //生產產品並接收
        Product product = director.build();
    }
}

class Director {//指揮者
    public AbstractBuilder abstractBuilder;

    //傳入具體建造者,決定創建哪種產品
    public void setAbstractBuilder(AbstractBuilder abstractBuilder) {
        this.abstractBuilder = abstractBuilder;
    }

    //控制產品的生產流程
    public Product build() {
        abstractBuilder.Step();
        return abstractBuilder.finish();
    }
}

abstract class AbstractBuilder {//抽象建造者
    public Product product = new Product();//初始化時是未完成品

    //規范建造方法
    public abstract void Step();

    //建造完成,返回產品
    public Product finish() {
        return product;
    }
}

class ConcreteBuilder extends AbstractBuilder {//Product的具體建造者

    //實現建造方法
    public void Step() {
    }
}

class Product {//產品
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM