1. 程式人生 > >《大話設計模式》——讀後感 (8)好菜每回味不同——建造者模式之基礎案例(1)

《大話設計模式》——讀後感 (8)好菜每回味不同——建造者模式之基礎案例(1)

ted builds src ret 分離 args 類圖 rec 方法

建造者模式:是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

建造者模式通常包括下面幾個角色:

1. builder:給出一個抽象接口,以規範產品對象的各個組成成分的建造。這個接口規定要實現復雜對象的哪些部分的創建,並不涉及具體的對象部件的創建。

2. ConcreteBuilder:實現Builder接口,針對不同的商業邏輯,具體化復雜對象的各部分的創建。 在建造過程完成後,提供產品的實例。

3. Director:調用具體建造者來創建復雜對象的各個部分,在指導者中不涉及具體產品的信息,只負責保證對象各部分完整創建或按某種順序創建。

4. Product:要創建的復雜對象

UML類圖:

技術分享

重要:建造者模式,是要有最終的建造對象,即Product。這一點與外觀模式有最明顯的區別。

具體產品(建造對象):

package com.sjmx.builder;

public class Entity {
    
    protected String name;
    protected String age;
    protected String sex;
    protected String height;
    protected String weight;
    
    public String getName() {
        
return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) {
this.sex = sex; } public String getHeight() { return height; } public void setHeight(String height) { this.height = height; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } @Override public String toString() { return "名字:" + this.name +",性別:" + this.sex + ",身高:" + this.height + ",體重:" + this.weight + ",年齡:" + this.age; } }

抽象接口:

package com.sjmx.builder;

public interface Builder {
    
    void buildName();
    void buildAge();
    void buildSex();
    void buildHeight();
    void buildWeight();
    
}

具體建造者1:

package com.sjmx.builder;

public class ConBuilder1 implements Builder {
    
    Entity entity = new Entity();
    
    @Override
    public void buildName() {
        entity.setName("cook");
    }

    @Override
    public void buildAge() {
         entity.setAge("10");
    }

    @Override
    public void buildSex() {
         entity.setSex("boy");
    }

    @Override
    public void buildHeight() {
        entity.setHeight("165cm");
    }

    @Override
    public void buildWeight() {
        entity.setWeight("54kg");
    }

    public Entity getResult(){
        return entity;
    }
}

具體建造者2(也可以僅有一個建造者):

package com.sjmx.builder;

public class ConBuilder2 implements Builder {
    
    Entity entity = new Entity();
    
    @Override
    public void buildName() {
        entity.setName("jack");
    }

    @Override
    public void buildAge() {
         entity.setAge("10");
    }

    @Override
    public void buildSex() {
         entity.setSex("girl");
    }

    @Override
    public void buildHeight() {
        entity.setHeight("175cm");
    }

    @Override
    public void buildWeight() {
        entity.setWeight("54kg");
    }
    
    public Entity getResult(){
        return entity;
    }
    
}

指揮者(此處我使用靜態方法實現,方便客戶端直接調用;實戰中可以不使用靜態方法):

package com.sjmx.builder;

public class Director {
    
     static void build(Builder b){
         b.buildHeight();
         b.buildWeight();
         b.buildSex();
         b.buildAge();
         b.buildName();
    }
    
}

客戶端:

package com.sjmx.builder;

public class Client {
    
    public static void main(String[] args) {
        
        ConBuilder1 c1 = new ConBuilder1();
        ConBuilder2 c2 = new ConBuilder2();
        
        Director.build(c1);
        Director.build(c2);
        
        Entity t1 =    c1.getResult();
        Entity t2 =    c2.getResult();
        
        System.out.println(t1.toString());
        System.out.println(t2.toString());
    }
}

運行結果:

技術分享

使用建造者模式的好處:

1.使用建造者模式可以使客戶端不必知道產品內部組成的細節。

2.具體的建造者類之間是相互獨立的,對系統的擴展非常有利。

3.由於具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模塊產生任何影響。

使用建造模式的場合:

1.創建一些復雜的對象時,這些對象的內部組成構件間的建造順序是穩定的,但是對象的內部組成構件面臨著復雜的變化。

2.要創建的復雜對象的算法,獨立於該對象的組成部分,也獨立於組成部分的裝配方法時。

個人總結:

1、建造者模式更像是一套工作車間,它負責產品各個部件的組裝,客戶端無須知道具體的建造過程,只需要拿到相應的產品即可,大大簡化了代碼的耦合度;

2、說白了,建造者模式側重的是一個建造者類的內部邏輯,而外觀模式側重的是各個子類之間的邏輯,區別很大

3、建造者類是要有具體的建造對象生成的,即產品;外觀模式沒有這一點要求

《大話設計模式》——讀後感 (8)好菜每回味不同——建造者模式之基礎案例(1)