建立複雜對象,試試建造者模式

前言

之前在用框架的時候發現建立一個對象要連着.出不少方法,最後竟然返回了我要的對象,不明覺厲,竟然是建造者模式。其實建造者沒那麼神奇,相似於建房子,將房子這個對象和建造的過程分離,而後咱們在建造的過程當中執行一步步的步驟,最後一步把建好的房子返回給我。建造者模式的定義:將一個複雜對象的構造與它的表示分離,使一樣的構建過程能夠建立不一樣的表示,這樣的設計模式被稱爲建造者模式。設計模式

工廠類模式提供的是建立單個類的模式,而建造者模式則是將各類產品集中起來進行管理,用來建立複合對象,所謂複合對象就是指某個類具備不一樣的屬性。
使用場景:
一、須要生成的對象具備複雜的內部結構。
二、須要生成的對象內部屬性自己相互依賴。
與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。bash

UML表示

一、Builder:爲建立一個產品對象的各個部件指定抽象接口
二、ConcreteBuilder:實現Builder的接口,構造和裝配該產品的各個組件,並提供建立該產品的一個接口
三、Director:構造一個使用Builder接口的對象。
四、Product:表示被構造的複雜對象框架

建造者模式UML類圖

從上圖能夠看出Builder是爲建立一個Product對象的各個部件指定的抽象接口,Product是具體的產品,Director是一個建造者,由他指揮使用Builder,ConcreteBuilder是具體的建造,實現Builder接口的各個方法。ide

建造者的靜態內部類模式

下面以建房子爲例使用靜態內部類的方式建一個房子測試

public class House {

    /**
     * 房子的地基
     */
    private String basic;

    /**
     * 房子的牆
     */
    private String wall;

    /**
     * 房子的屋頂
     */
    private String roof;

    public House(HouseBuilder houseBuilder) {
        this.basic = houseBuilder.basic;
        this.wall = houseBuilder.wall;
        this.roof = houseBuilder.roof;
    }

    @Override
    public String toString() {
        return "House{" +
                "basic='" + basic + '\'' + ", wall='" + wall + '\'' + ", roof='" + roof + '\'' +
                '}';
    }

    public static class HouseBuilder {

        private String basic;

        private String wall;

        private String roof;

        /**
         * 打地基
         * @param basic
         * @return
         */
        public HouseBuilder buildBasic(String basic) {
            this.basic = basic;
            return this;
        }

        /**
         * 砌牆
         * @param wall
         * @return
         */
        public HouseBuilder buildWall(String wall) {
            this.wall = wall;
            return this;
        }

        /**
         * 建樓頂
         * @param roof
         * @return
         */
        public HouseBuilder buildRoof(String roof) {
            this.roof = roof;
            return this;
        }

        /**
         * 建造房子
         * @return
         */
        public House build() {
            return new House(this);
        }

    }
}

複製代碼

本例中房子有地基,牆,屋頂三個屬性,而建房子就是組裝這三個部件,組成一個房子,也就是三個步驟:打地基,砌牆和建屋頂,而後在HouseBuilder中要提供一個對外的接口,將建好的House交出去,就是build()方法。ui

測試類

public static void main(String [] args) {
        House house = new House.HouseBuilder()
                .buildBasic("地基要穩固")
                .buildWall("牆要刷的很白")
                .buildRoof("樓頂要結實")
                .build();
        System.out.println(house.toString());
    }
複製代碼

運行結果: this

在測試類中咱們循序漸進的一步步建好了房子,最後經過build()方法拿到了咱們想要的房子,這種靜態內部類的方式代碼簡潔,寫起來也很順手。
相關文章
相關標籤/搜索