1. 程式人生 > >為夢想而奮鬥,無悔_一葉扁舟的點滴成長!

為夢想而奮鬥,無悔_一葉扁舟的點滴成長!

1.定義

建造者模式(Builder Pattern):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 建造者模式是一步一步建立一個複雜的物件,它允許使用者只通過指定複雜物件的型別和內容就可以構建它們,使用者不需要知道內部的具體構建細節。建造者模式屬於物件建立型模式。根據中文翻譯的不同,建造者模式又可以稱為生成器模式。

2.UML圖

3.程式碼

package com.skiff.www.product;
//這個一個產品類,一個產品裡面包含了很多小的零件,
public class Product {

    private String partA;

    private String partB;

    private String partC;

    public String getPartA() {
        return partA;
    }

    public String getPartB() {
        return partB;
    }

    public String getPartC() {
        return partC;
    }

    public void setPartA(String partA) {
        this.partA = partA;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }

    public void setPartC(String partC) {
        this.partC = partC;
    }

    @Override
    public String toString() {
        return "Product{" +
                "partA='" + partA + '\'' +
                ", partB='" + partB + '\'' +
                ", partC='" + partC + '\'' +
                '}';
    }
}
package com.skiff.www.product;

public abstract class Builder {
    protected Product product = new Product();
    public Product getProduct(){
        return product;
    }

    public abstract void buildpartA();
    public abstract void buildPartB();
    public abstract void buildPartC();

}
package com.skiff.www.product;

public class ContractBuilder1 extends Builder {
    @Override
    public void buildpartA() {
        product.setPartA("A1");
    }

    @Override
    public void buildPartB() {
        product.setPartB("B1");
    }

    @Override
    public void buildPartC() {
        product.setPartC("C1");
    }
}
package com.skiff.www.product;

//指揮者,指揮產品的組裝
public class Director {
    private Builder builder;

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

    //產品的構建與組裝
    public Product constract(){
        builder.buildpartA();
        builder.buildPartB();
        builder.buildPartC();
        return builder.getProduct();
    }
}
package com.skiff.www.product;

import org.junit.Test;

public class ProductTest {

    @Test
    public void productTest(){
        Builder builder = new ContractBuilder1();
        Director director = new Director(builder);
        Product constract = director.constract();
        System.out.println(constract);

    }
}

4.優缺點

(1)建造者模式的優點

       在建造者模式中,客戶端不必知道產品內部組成的細節,將產品本身與產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件

       每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,使用者使用不同的具體建造者即可得到不同的產品物件。 可以更加精細地控制產品的建立過程。將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰,也更方便使用程式來控制建立過程。

       增加新的具體建造者無須修改原有類庫的程式碼,指揮者類針對抽象建造者類程式設計,系統擴充套件方便,符合“開閉原則”。

(2)建造者模式的缺點如下:

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

如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。

5.應用

(1)模式適用環境 在以下情況下可以使用建造者模式:

        需要生成的產品物件有複雜的內部結構,這些產品物件通常包含多個成員屬性。

        需要生成的產品物件的屬性相互依賴,需要指定其生成順序。

        物件的建立過程獨立於建立該物件的類。在建造者模式中引入了指揮者類,將建立過程封裝在指揮者類中,而不在建造者類中。 隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品。

(2) JavaMail(一步一步構造一個完整的郵件物件,然後傳送)

…… //由郵件會話物件新建一個郵件訊息物件 MimeMessage message=new MimeMessage(session); //設定郵件地址 InternetAddress from=new InternetAddress("[email protected]"); message.setFrom(from);//設定發件人 InternetAddress to=new InternetAddress(to_mail); message.setRecipient(Message.RecipientType.TO,to);//設定收件人,並設定其接收型別為TO message.setSubject(to_title);//設定主題 message.setText(to_content);//設定信件內容 message.setSentDate(new Date());//設定發信時間 message.saveChanges();//儲存郵件資訊 Transport transport=session.getTransport("smtp"); transport.connect("smtp.test.com","test","test"); transport.sendMessage(message,message.getAllRecipients()); ……

(3) 在很多遊戲軟體中,地圖包括天空、地面、背景等組成部分,人物角色包括人體、服裝、裝備等組成部分,可以使用建造者模式對其進行設計,通過不同的具體建造者建立不同型別的地圖或人物。

6.總結

(1).建造者模式與抽象工廠模式的比較

        與抽象工廠模式相比,建造者模式返回一個組裝好的完整產品,而抽象工廠模式返回一系列相關的產品,這些產品位於不同的產品等級結構,構成了一個產品族。

        在抽象工廠模式中,客戶端例項化工廠類,然後呼叫工廠方法獲取所需產品物件,而在建造者模式中,客戶端可以不直接呼叫建造者的相關方法,而是通過指揮者類來指導如何生成物件,包括物件的組裝過程和建造步驟,它側重於一步步構造一個複雜物件,返回一個完整的物件。

         如果將抽象工廠模式看成汽車配件生產工廠,生產一個產品族的產品,那麼建造者模式就是一個汽車組裝工廠,通過對部件的組裝可以返回一輛完整的汽車。  

(2)建造者模式將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。建造者模式是一步一步建立一個複雜的物件,它允許使用者只通過指定複雜物件的型別和內容就可以構建它們,使用者不需要知道內部的具體構建細節。建造者模式屬於物件建立型模式。

建造者模式包含如下四個角色:

       抽象建造者為建立一個產品物件的各個部件指定抽象介面;

       具體建造者實現了抽象建造者介面,實現各個部件的構造和裝配方法,定義並明確它所建立的複雜物件,也可以提供一個方法返回建立好的複雜產品物件;

       產品角色是被構建的複雜物件,包含多個組成部件;

      指揮者負責安排複雜物件的建造次序,指揮者與抽象建造者之間存在關聯關係,可以在其construct()建造方法中呼叫建造者物件的部件構造與裝配方法,完成複雜物件的建造。

(3)在建造者模式的結構中引入了一個指揮者類,該類的作用主要有兩個:

       一方面它隔離了客戶與生產過程;      

       另一方面它負責控制產品的生成過程。指揮者針對抽象建造者程式設計,客戶端只需要知道具體建造者的型別,即可通過指揮者類呼叫建造者的相關方法,返回一個完整的產品物件。

        建造者模式的主要優點在於客戶端不必知道產品內部組成的細節,將產品本身與產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件,每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,符合“開閉原則”,還可以更加精細地控制產品的建立過程;          其主要缺點在於由於建造者模式所建立的產品一般具有較多的共同點,其組成部分相似,因此其使用範圍受到一定的限制,如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。

        建造者模式適用情況包括:需要生成的產品物件有複雜的內部結構,這些產品物件通常包含多個成員屬性;需要生成的產品物件的屬性相互依賴,需要指定其生成順序;物件的建立過程獨立於建立該物件的類;隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同型別的產品。