設(shè)計模式系列之鳴人VS比爾.雷澤

盤置青梅煤蚌,一樽煮酒,二人對坐,開懷暢飲铺然。操以手指玄德俗孝,然后自指曰:“天下英雄酒甸,唯使君與操耳”魄健。玄德乃以:“一震之威,乃至于此插勤!”應(yīng)對沽瘦。一個長歌當(dāng)嘯,豪氣沖天农尖,指點群雄析恋;一個寄人籬下,一味謙恭盛卡,裝孬不折本助隧。此乃曹劉經(jīng)典的煮酒論英雄。下面有請我們另外兩位英雄——鳴人和比爾.雷澤滑沧,這兩個二貨一見面就唾沫橫飛的要大干一場并村,最終上演了一場不倫不類的模式論英雄的忍術(shù)Vs科技之戰(zhàn)。

這里不再畫建造者模式滓技、抽象工廠模式和方法模式的UML圖了哩牍,如需要了解的可以去看一下小Y前面的文章建造者模式工廠方法模式令漂、抽象工廠模式

一膝昆、模式之戰(zhàn)第一戰(zhàn)—工廠方法模式VS建造者模式

①在工廠方法模式的加持下,直接產(chǎn)生了手持螺旋丸和具備仙人能力的基數(shù)龐大的鳴人隊伍叠必。
②在建造者模式的控制下荚孵,一個個比爾按照預(yù)定的順序生產(chǎn)出各個部分并組裝起來。

1.工廠方法模式建造鳴人

①鳴人接口

public interface MingRen {
    //鳴人的技能
    void getAbility();
}

②手持螺旋丸的鳴人

public class MingRenOfSpiral implements MingRen {

    @Override
    public void getAbility() {
        System.out.println("手持螺旋丸的鳴人纬朝。");
    }
}

③仙人模式的鳴人

public class MingRenOfFairy implements MingRen {

    @Override
    public void getAbility() {
        System.out.println("仙人模式的鳴人收叶。");
    }
}

④抽象鳴人制造工廠

public abstract class AbstractMingRenFactory {
    public abstract <T extends MingRen> T createMingRen(Class<T> c);
}

⑤鳴人制造工廠

public class MingRenFactory extends AbstractMingRenFactory {
    //定義一個要生產(chǎn)的鳴人
    private MingRen mingRen;
    @Override
    public <T extends MingRen> T createMingRen(Class<T> c) {
        try {
            //生產(chǎn)鳴人
            mingRen= (MingRen) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) mingRen;
    }
}

⑥生產(chǎn)鳴人

public class Client {

    public static void main(String []args){
        //聲明一個鳴人制造工廠
        AbstractMingRenFactory mingRenFactory=new MingRenFactory();
        //制造一個螺旋丸的鳴人
        MingRenOfSpiral mingRenOfSpiral=mingRenFactory.createMingRen(MingRenOfSpiral.class);
        mingRenOfFairy.getAbility();

        //制造一個仙人模式的鳴人
        MingRenOfFairy mingRenOfFairy=mingRenFactory.createMingRen(MingRenOfFairy.class);
        mingRenOfFairy.getAbility();
        
    
    }
}

鳴人制造工廠能夠源源不斷地生產(chǎn)出手持螺旋丸和進入仙人模式的鳴人,工廠方法模式主要的目的是能夠直接產(chǎn)生一個新的鳴人玄组,具體是手持螺旋丸還是仙人模式的鳴人滔驾,則由客戶端決定。也就是說具體怎么生產(chǎn)俄讹、怎么組裝哆致,這不是工廠方法模式考慮的,工廠方法模式關(guān)注的是一個產(chǎn)品的整體患膛。

2.建造法模式建造比爾雷澤

①生產(chǎn)一個比爾需要的部分摊阀,即產(chǎn)品

public class Bizzer {
    //比爾的身體
    private String body;
    //比爾的雪茄
    private String cigar;
    //比爾的武器
    private String arms;


    public String getBody() {
        return body;
    }

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

    public String getCigar() {
        return cigar;
    }

    public void setCigar(String cigar) {
        this.cigar = cigar;
    }

    public String getArms() {
        return arms;
    }

    public void setArms(String arms) {
        this.arms = arms;
    }
}

比爾雷雷澤簡化為三個部分:身體、雪茄、武器胞此。

②抽象建造者

public abstract class Builder {
    protected Bizzer bizzer=new Bizzer();
    //構(gòu)建比爾身體
    public void setBody(String body){
        this.bizzer.setBody(body);
    }
    //構(gòu)建比爾的雪茄
    public void setCigar(String cigar){
        this.bizzer.setCigar(cigar);
    }
    //構(gòu)建比爾的武器
    public void setArms(String arms) {
        this.bizzer.setArms(arms);
    }

    //得到完整的比爾
    public abstract Bizzer getBizzer();
}

比爾的組成部分上面都已經(jīng)知道了臣咖,具體怎么組裝就由實現(xiàn)類決定。

③裝備散彈槍的比爾

public class BizzerOneBuilder extends Builder {
    @Override
    public Bizzer getBizzer() {
        super.setBody("強壯的身軀");
        super.setArms("92年的雪茄");
        super.setArms("裝備散彈槍");
        return super.bizzer;
    }
}

④裝備加特林的比爾

public class BizzerTwoBuilder extends Builder {
    @Override
    public Bizzer getBizzer() {
        super.setBody("強壯的身軀");
        super.setArms("92年的雪茄");
        super.setArms("裝備加特林");
        return super.bizzer;
    }
}

上面兩個具體的建造者漱牵,它們都關(guān)注了各個部分夺蛇,它們的主要目的是通過不同的部件,不同的裝配產(chǎn)生不同的復(fù)雜對象酣胀,最主要的是關(guān)心產(chǎn)品的構(gòu)建順序刁赦。

⑤導(dǎo)演類

public class Director {
    //裝備散彈槍比爾建造者
    private static Builder bizzerOneBuilder=new BizzerOneBuilder();
    //裝備加特林比爾建造者
    private static Builder bizzerTwaoBuilder=new BizzerTwoBuilder();

    public static Bizzer getOneBizzer(){
        return bizzerOneBuilder.getBizzer();
    }
    public static Bizzer getTwoBizzer(){
        return bizzerTwaoBuilder.getBizzer();
    }
}

⑥生產(chǎn)比爾雷澤

public class Client {
    public static void main(String[] args){
        //建造一個手持散彈槍的比爾
        Bizzer bizzerOne=Director.getOneBizzer();
        //建造一個手持加特林的比爾
        Bizzer bizzerTwo=Director.getTwoBizzer();
    }
}

3.兩者的共同點和區(qū)別

共同點

工廠方法模式和建造者模式都屬于創(chuàng)建類模式,都是用來創(chuàng)建對象闻镶。

區(qū)別

  • 產(chǎn)品的復(fù)雜度不同
    工廠方法模式創(chuàng)建的產(chǎn)品一般都是單一性質(zhì)產(chǎn)品甚脉。而建造者模式創(chuàng)建的是一個復(fù)合產(chǎn)品,它由各個部件復(fù)合組成铆农,部件不同產(chǎn)品對象當(dāng)然也不同牺氨。

  • 主要目的不同
    工廠方法模式關(guān)注的是一個整體,無須關(guān)心產(chǎn)品各部分是如何創(chuàng)建出來的墩剖;但在建造者模式中猴凹,一個產(chǎn)品的產(chǎn)生是依賴各個部件以及裝配的順序,即是關(guān)注產(chǎn)品組成部分的創(chuàng)建過程涛碑。

二精堕、模式之戰(zhàn)第二戰(zhàn)—抽象工廠模式VS建造者模式

忍術(shù)VS科技第一戰(zhàn)比爾雷澤占了明顯的優(yōu)勢,在比拼過程中鳴人的優(yōu)勢是可以快速生產(chǎn)出基數(shù)龐大的鳴人群蒲障,對比爾進行數(shù)量上的壓制歹篓;但是比爾這貨優(yōu)勢在于注重組裝的細節(jié),每個部分都精細化生產(chǎn)揉阎,戰(zhàn)斗力也是不可比擬的庄撮,加上強武器的加持,鳴人大軍的正在節(jié)節(jié)敗退毙籽。鳴人怎么說都是一代梟雄洞斯,怎會沒有一兩個壓箱底的絕招呢,只見他口念咒語坑赡、手結(jié)手印烙如,更加龐大的加強版的鳴人軍蜂擁而至,重新形成了相抗衡的局面毅否。

1.鳴人的絕招-抽象工廠模式

按照抽象工廠模式亚铁,先定義一個鳴人接口,然后仙人模式的鳴人和九喇嘛模式的鳴人都實現(xiàn)鳴人接口螟加,我們從產(chǎn)品等級和產(chǎn)品族去分析徘溢,仙人模式和九喇嘛模式屬于同一個產(chǎn)品等級(有N個產(chǎn)品等級就應(yīng)該有N個實現(xiàn)工廠)吞琐,仙人模式和九喇嘛模式下面又可以會螺旋丸的和會鳴人連彈的(N個產(chǎn)品族,在抽象工廠類中就要有N個創(chuàng)建方法)然爆。

①鳴人接口

public interface MingRen {
    //鳴人的技能
    void getAbility();
}

②仙人模式的會連彈的鳴人

public class FairyModeOfMingRenBomb implements MingRen{
    @Override
    public void getAbility() {
        System.out.println("仙人模式的會連彈的鳴人");
    }
}

③仙人模式的會旋螺丸的鳴人

public class FairyModeOfMingRenSpiral implements MingRen{
    @Override
    public void getAbility() {
        System.out.println("仙人模式的會旋螺丸的鳴人");
    }
}

④九喇嘛模式的會連彈的鳴人

public class NineLamaOfMingRenBomb implements MingRen{
    @Override
    public void getAbility() {
        System.out.println("九喇嘛模式的會連彈的鳴人");
    }
}

⑤九喇嘛模式的會旋螺丸的鳴人

public class NineLamaOfMingRenSpiral implements MingRen{
    @Override
    public void getAbility() {
        System.out.println("九喇嘛模式的會旋螺丸的鳴人");
    }
}

⑦抽象工廠

public interface MingRenFactory {
    //創(chuàng)建會連彈的鳴人
    public MingRen createMingRenBomb();
    //創(chuàng)建會旋螺丸的鳴人
    public MingRen createMingRenSpiral();
}

⑧仙人模式鳴人工廠

public class FairyModeMingRenFactory implements MingRenFactory {

    @Override
    public MingRen createMingRenBomb() {
        return new FairyModeOfMingRenBomb();
    }

    @Override
    public MingRen createMingRenSpiral() {
        return new FairyModeOfMingRenSpiral();
    }
}

⑨九喇嘛模式鳴人工廠

public class NineLamaMingRenFactory implements MingRenFactory {

    @Override
    public MingRen createMingRenBomb() {
        return new NineLamaOfMingRenBomb();
    }

    @Override
    public MingRen createMingRenSpiral() {
        return new NineLamaOfMingRenSpiral();
    }
}

⑩開始生產(chǎn)鳴人

public class Client {

    public static void main(String[] args){
        //分別生產(chǎn)一個仙人模式下的會連彈和會旋螺丸的鳴人
        FairyModeMingRenFactory fairyModeMingRenFactory=new FairyModeMingRenFactory();
        MingRen mingRenOne=fairyModeMingRenFactory.createMingRenBomb();
        mingRenOne.getAbility();
        MingRen mingRenTwo=fairyModeMingRenFactory.createMingRenSpiral();
        mingRenTwo.getAbility();
    }
}

抽象工廠模式頁注重完整性站粟,一個產(chǎn)品一旦找到一個工廠生產(chǎn),那就會生產(chǎn)出一個固定的產(chǎn)品曾雕,這樣子鳴人的加強版大軍很快就被生產(chǎn)出來了奴烙。

2.抽象工廠和建造者模式的區(qū)別

  • 抽象工廠模式是工廠方法模式的升級版,前面也說了翻默,抽象工廠模式關(guān)注產(chǎn)品的整體缸沃,而建造者模式則關(guān)注構(gòu)建的過程,兩者的場景因此也大不相同修械,如果希望屏蔽對象的創(chuàng)建過程,只提供一個封裝良好的對象检盼,則可以選擇抽象工廠模式肯污;如果通過轉(zhuǎn)配不同的組件和構(gòu)建的順序可以產(chǎn)生一個新的對象,同時建造者模式創(chuàng)建的是一個復(fù)合產(chǎn)品吨枉,它由各個部件復(fù)合組成蹦渣。

三、拓展之戰(zhàn)—抽象工廠模式VS工廠方法模式

工廠創(chuàng)建一種產(chǎn)品貌亭,抽象工廠創(chuàng)建的是一組產(chǎn)品柬唯,是一個產(chǎn)品系列。這里要注意的是“系列”的意思圃庭,也就是說锄奢,抽象工廠創(chuàng)建出的一組產(chǎn)品是成套的。
當(dāng)有一個接口可以有多種實現(xiàn)的時候剧腻,可以考慮使用工廠方法來創(chuàng)建實例拘央。
當(dāng)有一組接口可以有多種實現(xiàn)方案的時候,可以考慮使用抽象工廠創(chuàng)建實例組书在。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灰伟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子儒旬,更是在濱河造成了極大的恐慌栏账,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栈源,死亡現(xiàn)場離奇詭異挡爵,居然都是意外死亡,警方通過查閱死者的電腦和手機凉翻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門了讨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捻激,“玉大人,你說我怎么就攤上這事前计“罚” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵男杈,是天一觀的道長丈屹。 經(jīng)常有香客問我,道長伶棒,這世上最難降的妖魔是什么旺垒? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮肤无,結(jié)果婚禮上先蒋,老公的妹妹穿的比我還像新娘。我一直安慰自己宛渐,他們只是感情好竞漾,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窥翩,像睡著了一般业岁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寇蚊,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天笔时,我揣著相機與錄音,去河邊找鬼仗岸。 笑死允耿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爹梁。 我是一名探鬼主播右犹,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姚垃!你這毒婦竟也來了念链?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤积糯,失蹤者是張志新(化名)和其女友劉穎掂墓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體看成,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡君编,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了川慌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吃嘿。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡祠乃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兑燥,到底是詐尸還是另有隱情亮瓷,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布降瞳,位于F島的核電站嘱支,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挣饥。R本人自食惡果不足惜除师,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扔枫。 院中可真熱鬧汛聚,春花似錦、人聲如沸茧吊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搓侄。三九已至,卻和暖如春话速,著一層夾襖步出監(jiān)牢的瞬間讶踪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工泊交, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乳讥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓廓俭,卻偏偏與公主長得像云石,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子研乒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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