建造者模式(Builder Pattern)

建造者模式

一、什麼是建築者模式?

  建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建一個複雜的對象。

  一個 Builder 類會一步一步構造最終的對象,該 Builder 類獨立於其他對象。

  建造者模式主要解決在軟件系統中,有時候面臨着"一個複雜對象"的創建工作,其通常由各個部分的子對象用一定的算法構成;由於需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是將它們組合在一起的算法卻相對穩定

二、建造者模式的具體實現

結構圖

建造者模式中的四個角色:
  1. Builder:給出一個抽象接口,以規範產品對象的各個組成成分的建造。這個接口規定要實現複雜對象的哪些部分的創建,並不涉及具體的對象部件的創建。
  2. ConcreteBuilder:實現Builder接口,針對不同的商業邏輯,具體化複雜對象的各部分的創建。 在建造過程完成後,提供產品的實例。
  3. Director:調用具體建造者來創建複雜對象的各個部分,在指導者中不涉及具體產品的信息,只負責保證對象各部分完整創建或按某種順序創建。
  4. Product:要創建的複雜對象。
java代碼實現

1、創建人類實體類

package com.designpattern.builderPattern;

/**
 * 對象 人
 *
 * @author zhongtao on 2018/9/17
 */
public class Human {

    private String head;
    private String body;
    private String hand;
    private String foot;

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getHand() {
        return hand;
    }

    public void setHand(String hand) {
        this.hand = hand;
    }

    public String getFoot() {
        return foot;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }
}

2、創建造人的 Builder 接口

package com.designpattern.builderPattern;

/**
 * 造人接口 規定造人的規範 需要頭、身體、手、腳
 *
 * @author zhongtao on 2018/9/17
 */
public interface BuilderHuman {

    void buildHead();

    void buildBody();

    void buildHand();

    void buildFoot();

    /**
     * 返回創建的對象
     */
    Human createHuman();

}

3、ConcreteBuilder 創建不同類型的人

tallPerson

package com.designpattern.builderPattern;

/**
 * 高個子的人
 *
 * @author zhongtao on 2018/9/17
 */
public class TallPersonBuilder implements BuilderHuman {

    Human human;

    public TallPersonBuilder() {
        human = new Human();
    }

    @Override
    public void buildHead() {
        human.setHead("普通的頭腦");
    }

    @Override
    public void buildBody() {
        human.setBody("壯實,高大的身體");
    }

    @Override
    public void buildHand() {
        human.setHand("長手");
    }

    @Override
    public void buildFoot() {
        human.setFoot("長腳");
    }

    @Override
    public Human createHuman() {
        return human;
    }
}

smartHuman

package com.designpattern.builderPattern;

/**
 * 聰明的人
 *
 * @author zhongtao on 2018/9/17
 */
public class SmartHumanBuilder implements BuilderHuman {

    Human human;

    public SmartHumanBuilder() {
        human = new Human();
    }

    @Override
    public void buildHead() {
        human.setHead("高智商的頭腦");
    }

    @Override
    public void buildBody() {
        human.setBody("健康的身體");
    }

    @Override
    public void buildHand() {
        human.setHand("普通的手");
    }

    @Override
    public void buildFoot() {
        human.setFoot("普通的腳");
    }

    @Override
    public Human createHuman() {
        return human;
    }
}

4、Director 建造者模式的核心 調用具體建造者來創建不同的人

package com.designpattern.builderPattern;

/**
 * 管理造人的順序 BuilderHuman不同,則創建的人不同
 * @author zhongtao on 2018/9/17
 */
public class HumanDirector {

    public Human createHumanByDirector(BuilderHuman builderHuman){
        builderHuman.buildHead();
        builderHuman.buildBody();
        builderHuman.buildHand();
        builderHuman.buildFoot();

        return builderHuman.createHuman();
    }
}

5、建造者模式測試

package com.designpattern.builderPattern;

import org.junit.Test;

/**
 * 測試
 *
 * @author zhongtao on 2018/9/17
 */
public class BuilderPatternTest {

    /**
     * 測試建造者模式
     */
    @Test
    public void test() {
        HumanDirector humanDirector = new HumanDirector();
        //創建高個子的人
        Human humanByDirector = humanDirector.createHumanByDirector(new TallPersonBuilder());
        System.out.println(humanByDirector.getHead());
        System.out.println(humanByDirector.getBody());
        System.out.println(humanByDirector.getHand());
        System.out.println(humanByDirector.getFoot());

        System.out.println("------簡單的分割線------");
        //創建聰明的人
        Human smartHuman = humanDirector.createHumanByDirector(new SmartHumanBuilder());
        System.out.println(smartHuman.getHead());
        System.out.println(smartHuman.getBody());
        System.out.println(smartHuman.getHand());
        System.out.println(smartHuman.getFoot());
    }
}

三、建造者模式的優缺點

優點:
  1. 建造者獨立,易擴展。
  2. 便於控制細節風險。
缺點:
  1. 產品必須有共同點,範圍有限制。
  2. 如內部變化複雜,會有很多的建造類。
注意事項:

與工廠模式的區別,建造者模式更加關注與零件裝配的順序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章