一天一個設計模式:建造模式

概念:

  建造模式是對象的創建模式,建造模式可以將一個產品的內部表象(個人理解,可以稱爲組件)與產品的生產分割開來,從而可以使一個建造過程生產出來具有不同內部表象的產品對象。

概念:

產品的內部表象:

  產品不同組成成分構成(組件)這些零件可以是對象,也可以是非對象,稱爲內部表象(internal representation),不同的產品可以有不同的內部表象,也就是不同的零件,使用建造模式可以使客戶端不需要知道生產的產品有哪些零件,每個產品的對應零件批次有什麼不同,是怎麼建造出來的,怎麼組裝產品。

內部表象的建造:

  構建對象的過程外化到另一個建造者對象內完成,而建造者對象返回給客戶端的是一個建設完畢的產品對象(將零件的構建跟產品的交付分開)。

uml結構圖:

四個角色:

  抽象構建者(Builder)角色:給出抽象接口,規範產品對象的組件的生產方式,該接口通常獨立於應用程序的商業邏輯。抽象的方法往往與對象的組件有關。

  具體建造者(ConCreateBuilder)角色:實現抽象接口,完成組件的構建,並提供一個方法用於組裝最終的產品。

  導演者(director)角色:調用具體的建造者角色以創建產品對象,僅僅起到指揮的作用。

  產品(product)角色:產品是最終的產品角色,包含各種不同的組件。

  導演者角色是與客戶端打交道的角色。導演者將客戶端創建產品的請求劃分爲對各個零件的建造請求,再將這些請求委派給具體建造者角色。具體建造者角色是做具體建造工作的,但是卻不爲客戶端所知。

  一般來說,每有一個產品類,就有一個相應的具體建造者類。這些產品應當有一樣數目的零件,而每有一個零件就相應地在所有的建造者角色裏有一個建造方法。

產品類product

public class Product {
    /**
     * 定義一些關於產品的操作
     */
    private String part1;
    private String part2;
    public String getPart1() {
        return part1;
    }
    public void setPart1(String part1) {
        this.part1 = part1;
    }
    public String getPart2() {
        return part2;
    }
    public void setPart2(String part2) {
        this.part2 = part2;
    }
}

抽象建造者類Builder

public interface Builder {
    public void buildPart1();
    public void buildPart2();
    public Product retrieveResult();
}

具體建造者類ConcreteBuilder

public class ConcreteBuilder implements Builder {

    private Product product = new Product();
    /**
     * 產品零件建造方法1
     */
    @Override
    public void buildPart1() {
        //構建產品的第一個零件
     product.setPart1("編號:9527");
    }
    /**
     * 產品零件建造方法2
     */
    @Override
    public void buildPart2() {
        //構建產品的第二個零件
     product.setPart2("名稱:XXX");
    }
    /**
     * 產品返還方法
     */
    @Override
    public Product retrieveResult() {
        return product;
    }

}

導演者類Director

public class Director {
    /**
     * 持有當前需要使用的建造器對象
     */
    private Builder builder;
    /**
     * 構造方法,傳入建造器對象
     * @param builder 建造器對象
     */
    public Director(Builder builder){
        this.builder = builder;
    }
    /**
     * 產品構造方法,負責調用各個零件建造方法
     */
    public void construct(){
        builder.buildPart1();
        builder.buildPart2();
    }
}

客戶端類Client

public class Client {
    public static void main(String[]args){
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.construct();
        Product product = builder.retrieveResult();
        System.out.println(product.getPart1());
        System.out.println(product.getPart2());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章