Android設(shè)計(jì)模式(四)-- 建造者模式

源代碼
GitHub源代碼

1.本文目標(biāo)

本文目標(biāo)是為了讓大家認(rèn)識(shí)并理解建造者設(shè)計(jì)模式。

2.基本套路

定義:將一個(gè)復(fù)雜的對(duì)象的構(gòu)建和它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示
類(lèi)型:創(chuàng)建型
選擇關(guān)鍵點(diǎn):各個(gè)產(chǎn)品的構(gòu)建過(guò)程是否相同
設(shè)計(jì)原則:遵循單一職責(zé)、開(kāi)閉原則
使用概率:10%
難度系數(shù):中

3.適用場(chǎng)景

1.如果一個(gè)對(duì)象有非常復(fù)雜的內(nèi)部結(jié)構(gòu)(很多屬性字段)
2.想把復(fù)雜對(duì)象的創(chuàng)建和使用分離。

4.使用步驟

1.定義大俠的過(guò)程(Builder):定義大俠的名字,年齡和武功
2.構(gòu)建真正的Person對(duì)象并返回
3.Builder屬性賦值給Person
4.創(chuàng)建具體的建造者
5.客戶(hù)端調(diào)用-創(chuàng)建武林隱士高手

5.舉個(gè)栗子

我們用具體的代碼去更好的理解這個(gè)設(shè)計(jì)模式

5.1栗子說(shuō)明

  • 背景:打游戲想創(chuàng)建一個(gè)武林大俠
  • 目的:希望通過(guò)建造者模式去創(chuàng)建

5.2使用步驟

實(shí)現(xiàn)代碼如下:

public class Person {
    private String mName;
    private int mAge;
    private String mKungFu;

    /**
     * 步驟3:Builder屬性賦值給Person
     * 構(gòu)造函數(shù)私有化
     * 只讓下面的靜態(tài)方法builder()能夠創(chuàng)建對(duì)象
     */
    private Person(Builder builder) {
        mName = builder.getName();
        mAge = builder.getAge();
        mKungFu = builder.getKungFu();
    }

    /**
     * 步驟4:創(chuàng)建具體的建造者
     * 構(gòu)建Person對(duì)象的構(gòu)建器,就是通過(guò)Builder這個(gè)對(duì)象去構(gòu)建Person對(duì)象
     */
    public static Builder builder() {
        return new Builder();
    }

    /**
     * 步驟1:定義大俠的過(guò)程(Builder):定義大俠的名字,年齡和武功
     */
    public static class Builder {

        private String mName;
        private int mAge;
        private String mKungFu;

        public Builder setName(String name) {
            this.mName = name;
            return this;
        }

        public Builder setAge(int age) {
            this.mAge = age;
            return this;
        }

        public Builder setKungFu(String kungfu) {
            this.mKungFu = kungfu;
            return this;
        }

        public String getName() {
            return mName;
        }

        public int getAge() {
            return mAge;
        }

        public String getKungFu() {
            return mKungFu;
        }

        /**
         * 步驟2:構(gòu)建真正的Person對(duì)象并返回
         */
        public Person build() {
            return new Person(this);
        }
    }

    @Override
    public String toString() {
        return "Person{" +
                "mName='" + mName + '\'' +
                ", mAge=" + mAge +
                ", mKungFu='" + mKungFu + '\'' +
                '}';
    }
}

測(cè)試類(lèi):

 public static void main(String[] args) {
        Person person = Person.builder()
                .setName("風(fēng)清揚(yáng)")
                .setAge(99)
                .setKungFu("獨(dú)孤九劍")
                .build();
        System.out.println(person.toString());
  }

6.優(yōu)點(diǎn)

  • 封裝性好,創(chuàng)建和使用分離
  • 擴(kuò)展性好,建造類(lèi)之間獨(dú)立,一定程度上解耦

7.缺點(diǎn)

  • 產(chǎn)生多余的Builder對(duì)象
  • 產(chǎn)品內(nèi)部發(fā)生變化,建造者都要修改,成本比較大

8.其他一些思考

建造者模式和工廠模式比較相近,所以二者的區(qū)別:
1.建造者模式更注重于方法的調(diào)用順序。
2.工廠模式注重于創(chuàng)建產(chǎn)品。
3.創(chuàng)建對(duì)象的力度不同,建造者模式可以創(chuàng)建復(fù)雜的產(chǎn)品,由各種復(fù)雜的部件組成,工廠模式創(chuàng)建出來(lái)的都是一個(gè)樣子。
4.工廠模式把這個(gè)對(duì)象創(chuàng)建出來(lái)就OK了,但是建造者模式不只是要?jiǎng)?chuàng)建出這個(gè)產(chǎn)品,還要知道這個(gè)產(chǎn)品由哪些部件組成的。

9.總結(jié)

本文只是對(duì)建造者模式進(jìn)行一個(gè)分享,接下來(lái)會(huì)從創(chuàng)建型模式,結(jié)構(gòu)型模式,行為型模式,這三大類(lèi)展開(kāi)一個(gè)系列分享,大家可以持續(xù)進(jìn)行關(guān)注,信仰年輕的設(shè)計(jì)模式,蟹蟹啦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容