設計模式之建造者模式

1. 名詞解釋

將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。java

好比一臺電腦包括主機、顯示器、鍵盤等外設,這些部件組成了完整的一臺電腦。如何將這些部件組裝成一臺完整的電腦並返回給用戶,這是建造者模式須要解決的問題。建造者模式(builder)又稱爲生成器模式,從名詞就能夠看出,它是一種較爲複雜、使用頻率也相對較低的建立型模式。建造者模式爲客戶端返回的不是一個簡單的產品,而是一個由多個部件組成的複雜產品。 設計模式

2. 建造者模式UML圖

builder
builder

上圖中包含了建造者模式的四個主要角色:微信

  • Builder(抽象建造者):它爲建立一個產品Product對象的各個部件指定抽象方法,在該接口中通常聲明兩類方法,一類方法是buildPartX(),它們用於建立複雜對象的各個部件;另外一類方法是getResult(),它們用於返回複雜對象。Builder既能夠是抽象類,也能夠是接口。
  • ConcreteBuilder(具體建造者):它實現了Builder抽象方法,實現各個部件的具體構造和裝配方法,定義並明確它所建立的複雜對象,也能夠提供一個方法返回建立好的複雜產品對象。依賴於Product。
  • Product(產品角色):它是被構建的複雜對象,包含多個組成部件,具體建造者建立該產品的內部表示並定義它的裝配過程。
  • Director(指揮者):指揮者又稱爲導演類,它負責安排複雜對象的建造次序,指揮者與抽象建造者之間存在關聯關係,能夠在其construct()建造方法中調用建造者對象的部件構造與裝配方法,完成複雜對象的建造。客戶端通常只須要與指揮者進行交互,在客戶端肯定具體建造者的類型,並實例化具體建造者對象(也能夠經過配置文件和反射機制),而後經過指揮者類的構造函數或者Setter方法將該對象傳入指揮者類中。

3. 建造者模式實現

下面代碼基於Java實現的一個建造者模式。函數

@data
class Product {  
    private String name;  
    private String type;  
    public void showProduct(){  
        System.out.println("名稱:"+name);  
        System.out.println("型號:"+type);  
    }  
}  

//抽象類
abstract class Builder {  
    public abstract void buildPart(String arg1, String arg2);  
    public abstract Product getProduct();  
}  

//具體建造者
class ConcreteBuilder extends Builder {  
    private Product product = new Product();  

    public Product getResult() {  
        return product;  
    }  

    public void buildPart(String arg1, String arg2) {  
        product.setName(arg1);  
        product.setType(arg2);  
    }  
}  

// 指揮者 
public class Director {  
    private Builder builder;

    public Director(Builder builder) {
       this.builder=builder;
    }

    public void setBuilder(Builder builder) {
       this.builder=builer;
    } 
    public Product construct(){  
        builder.buildPart("lenvono","Y470");  
        return builder.getResult();  
    }   
}  
//客戶端調用
public class Client {  
    public static void main(String[] args){ 
        Builder builder = new ConcreteBuilder(); 
        Director director = new Director(builder);  
        Product product = director.construct();  
        product1.showProduct();  
    }  
}複製代碼

四個角色都包含在上面的實現中,客戶端進行調用,對於客戶端而言,只需關心具體的建造者便可。在指揮者類中能夠注入一個抽象建造者類型的對象,其核心在於提供了一個建造方法construct(),在該方法中調用了builder對象的構造部件的方法,最後返回一個產品對象。ui

4. 與工廠模式區別

建造者模式的優勢是封裝性好,且易於擴展。上面提到,對於客戶端而言,只需關心具體的建造者便可。使用建造者模式能夠優先的封裝變化,product和builder比較穩定,主要的業務邏輯封裝在控制類中對總體可取得比較好的穩定性。如需擴展,只須要加一個新的建造者,對以前代碼沒有影響。this

與工廠模式相比,建造者模式通常用來建立更爲複雜的對象,由於對象的建立過程更爲複雜,所以將對象的建立過程獨立出來組成一個新的類——指揮者類。也就是說,工廠模式是將對象的所有建立過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而建造者模式中,建造者類通常只提供產品類中各個組件的建造,而將具體建造過程交付給指揮者類。由指揮者類負責將各個組件按照特定的規則組建爲產品,而後將組建好的產品交付給客戶端。spa

5. 總結

本文講解了設計模式中的建造者模式,大的分類屬於建立型模式。首先介紹了建造者模式的概念;而後給出了建造者模式的類圖,並對其中涉及到的四個角色進行了解釋;又給出了基於Java實現的代碼;最後簡單說了下其優勢,與工廠模式的區別。建造者模式主要適用於建立一些複雜的對象,這些對象的內部組成構件間的建造順序是穩定的,可是對象的內部組成構件面臨着複雜的變化。.net

訂閱最新文章,歡迎關注個人公衆號

微信公衆號
微信公衆號


參考

  1. 《java與模式》閻宏
  2. 23種設計模式(4):建造者模式
相關文章
相關標籤/搜索