設(shè)計模式之建造者模式

定義:

將一個復(fù)雜對象的構(gòu)建與它的表示分離欧瘪,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

使用場景:
(1)相同的使用方法,不同的執(zhí)行順序鳄抒,產(chǎn)生不同的事件結(jié)果時。
(2)多個部件或零件椰弊,都可以裝配到一個對象中许溅,但是產(chǎn)生的運行結(jié)果又不相同時。
(3)產(chǎn)品類非常復(fù)雜秉版,或者產(chǎn)品類中的調(diào)用順序不同產(chǎn)生了不同的作用贤重。
(4)當(dāng)初始化一個對象特別復(fù)雜,如參數(shù)多沐飘,且很多參數(shù)都具有默認值時游桩。

/**
 * 抽象產(chǎn)品類
 */
abstract class Product {
    protected String name;
    protected String type;

    public void setName(String name) {
        this.name = name;
    }

    public void setType(String type) {
        this.type = type;
    }

    public abstract void showProduct();
}

/**
 * 小米手機
 */
public class XiaoMiPhone extends Product {
    
    @Override
    public void showProduct() {
        System.out.println("名稱:" + name + "型號:" + type);
    }
}

/**
 * 抽象建造者類
 */
abstract class Builder {
    public abstract Builder setName(String name);

    public abstract Builder setType(String type);

    public abstract Product create();
}

/**
 * 具體建造者
 */
class ConcreteBuilder extends Builder {
    private Product product = new XiaoMiPhone();

    @Override
    public Builder setName(String name) {
        product.setName(name);
        return this;
    }

    @Override
    public Builder setType(String type) {
        product.setType(type);
        return this;
    }

    @Override
    public Product create() {
        return product;
    }

    /**
     * 動態(tài)注入不同產(chǎn)品
     *
     * @param product
     */
    public void setProduct(Product product) {
        this.product = product;
    }
}

/**
 * 指揮者--用于具體產(chǎn)品的構(gòu)造
 */
public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Product constructA(String name, String type) {
        return builder.setName(name).setType(type).create();
    }

    public Product constructB(String name, String type) {
        return builder.setType(type).setName(name).create();
    }
}

/**
 * 客戶端調(diào)用
 */
public class Client {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        Product productA = director.constructA("小米", "MI-6X");
        productA.showProduct();
        Product productB = director.constructB("為發(fā)燒而生:小米", "MI-6X");
        productB.showProduct();
    }
}

安卓源碼中的常見用法:

AlertDialog.Builer builder=new AlertDialog.Builder(context);
builder.setIcon(R.drawable.icon)
    .setTitle("title")
    .setMessage("message")
    .setPositiveButton("Button1", 
        new DialogInterface.OnclickListener(){
            public void onClick(DialogInterface dialog,int whichButton){
                setTitle("click");
            }   
        })
    .create()
    .show();

最簡單常用的寫法:

/**
 * 蘋果手機
 */
public class ApplePhone {
    private String name;
    private String type;

    public static class Builder {
        private String name;
        private String type;

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

        public Builder setType(String type){
            this.type = type;
            return this;
        }

        public ApplePhone create() {
            ApplePhone phone = new ApplePhone();
            phone.name = name;
            phone.type = type;
            return phone;
        }
    }
}

/**
 * 客戶端調(diào)用
 */
public class Client {
    public static void main(String[] args) {
        ApplePhone.Builder builder = new ApplePhone.Builder();
        ApplePhone phone = builder.setType("Iphone8X").setName("我是一個小蘋果").create();
    }
}

建造者模式的優(yōu)點是封裝性好,且易于擴展耐朴。建造者類一般只提供產(chǎn)品類中各個組件的建造借卧,而將具體建造過程交付給指揮者類。由指揮者類負責(zé)將各個組件按照特定的規(guī)則組建為產(chǎn)品筛峭,然后將組建好的產(chǎn)品交付給客戶端铐刘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市影晓,隨后出現(xiàn)的幾起案子镰吵,更是在濱河造成了極大的恐慌檩禾,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疤祭,死亡現(xiàn)場離奇詭異盼产,居然都是意外死亡,警方通過查閱死者的電腦和手機勺馆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門戏售,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人草穆,你說我怎么就攤上這事灌灾。” “怎么了悲柱?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵锋喜,是天一觀的道長。 經(jīng)常有香客問我豌鸡,道長嘿般,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任直颅,我火速辦了婚禮博个,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘功偿。我一直安慰自己盆佣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布械荷。 她就那樣靜靜地躺著共耍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吨瞎。 梳的紋絲不亂的頭發(fā)上痹兜,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音颤诀,去河邊找鬼字旭。 笑死,一個胖子當(dāng)著我的面吹牛崖叫,可吹牛的內(nèi)容都是我干的遗淳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼心傀,長吁一口氣:“原來是場噩夢啊……” “哼屈暗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤养叛,失蹤者是張志新(化名)和其女友劉穎种呐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弃甥,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡爽室,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淆攻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肮之。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卜录,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眶明,我是刑警寧澤艰毒,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站搜囱,受9級特大地震影響丑瞧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜀肘,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一绊汹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扮宠,春花似錦西乖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至收捣,卻和暖如春届案,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罢艾。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工楣颠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咐蚯。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓童漩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仓蛆。 傳聞我的和親對象是個殘疾皇子睁冬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 建造者模式 想象一下,我們想要創(chuàng)建一個由多個部分構(gòu)成的對象,而且它的構(gòu)成需要一步接一步地完成豆拨。只有當(dāng)各個部分都創(chuàng)建...
    英武閱讀 2,194評論 1 50
  • 建造者模式(Builder Pattern)也叫做生成器模式,今天讓我們一起學(xué)習(xí)一下建造者模式直奋。 一、基本介紹 建...
    冰鑒IT閱讀 690評論 2 8
  • 1施禾、初識建造者模式 建造者模式屬于創(chuàng)建型模式脚线。比如說:樓房是千差萬別的,樓房的外形弥搞,層數(shù)邮绿,內(nèi)部房間的數(shù)量,房間的裝...
    嘮嗑008閱讀 471評論 0 2
  • 喜歡一個人攀例,也許就因為他某一個特性吸引了你船逮。對,他的不學(xué)無術(shù)粤铭,他的小可愛就深深吸引了我挖胃,貫穿了我整個高中甚至某一段...
    hands_up閱讀 249評論 0 1
  • 注:這原本是2017年3月11日在 DSC(Design Sprint China)設(shè)計沖刺社區(qū)的上海兩日工作坊之...
    任寧閱讀 2,260評論 5 17