設(shè)計(jì)模式(九)建造者模式

總章目錄,設(shè)計(jì)模式(一)基本介紹

一、簡(jiǎn)介

建造者模式(Builder Pattern) 又名生成器模式,是一種對(duì)象構(gòu)建模式。它可以將復(fù)雜對(duì)象的建造過(guò)程抽象出來(lái)(抽象類別),使這個(gè)抽象過(guò)程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對(duì)象。
建造者模式 是一步一步創(chuàng)建一個(gè)復(fù)雜的對(duì)象,它允許用戶只通過(guò)指定復(fù)雜對(duì)象的類型和內(nèi)容就可以構(gòu)建它們,用戶不需要知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。
UML類圖:
1、抽象建造者(Builder):抽象接口或類,以規(guī)范產(chǎn)品對(duì)象的各個(gè)組成成分的建造。
2、具體建造者(ConcreteBuilder):1.實(shí)現(xiàn)抽象建造者Builder所聲明的接口,給出一步一步地完成創(chuàng)建產(chǎn)品實(shí)例的操作。2.在建造過(guò)程完成后,提供產(chǎn)品的實(shí)例。
3、指導(dǎo)者(Director):擔(dān)任這個(gè)角色的類調(diào)用具體建造者角色以創(chuàng)建產(chǎn)品對(duì)象。
4、產(chǎn)品(Product):產(chǎn)品便是建造中的復(fù)雜對(duì)象。

優(yōu)點(diǎn):

  1. 客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過(guò)程解耦,使得相同的創(chuàng)建過(guò)程可以創(chuàng)建不同的產(chǎn)品對(duì)象。
  2. 每一個(gè)具體建造者都相對(duì)獨(dú)立,而與其他的具體建造者無(wú)關(guān),因此可以很方便地替換具體建造者或增加新的具體建造者, 用戶使用不同的具體建造者即可得到不同的產(chǎn)品對(duì)象 。
  3. 可以更加精細(xì)地控制產(chǎn)品的創(chuàng)建過(guò)程 。將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過(guò)程更加清晰,也更方便使用程序來(lái)控制創(chuàng)建過(guò)程。
  4. 增加新的具體建造者無(wú)須修改原有類庫(kù)的代碼,指揮者類針對(duì)抽象建造者類編程,系統(tǒng)擴(kuò)展方便,符合 “開閉原則”

缺點(diǎn):

  1. 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點(diǎn),因此其使用范圍受限。
  2. 產(chǎn)品的內(nèi)部變化復(fù)雜,會(huì)導(dǎo)致系統(tǒng)變得很龐大。

二、實(shí)現(xiàn)

以下方式為簡(jiǎn)單的實(shí)現(xiàn),通常會(huì)在create時(shí)賦值,賦值時(shí)僅保存變量

public class Summoner {
    private String shoes;
    private String arms;
    private String name;

    //省略 get  set

    public static class Builder {

        Summoner summoner;

        public void Builder(){
              summoner = new Summoner();
        }

        public Builder setArms(String arms) {
            summoner.setArms(arms);
            return this;
        }

        public Builder setShoes(String shoes) {
            summoner.setShoes(shoes);
            return this;
        }

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

        public Summoner build() {
            return summoner;
        }
    }
}
public class client {
    public static void main(String[] args) {
        Summoner summoner = new Summoner.Builder()
                .setName("武器大師")
                .setArms("三相之力")
                .setShoes("水銀鞋");
        System.out.println(summoner.toString());
    }
}
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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