初識(shí)設(shè)計(jì)模式之簡(jiǎn)單工廠(chǎng)模式槐瑞、工廠(chǎng)方法模式熙涤、抽象工廠(chǎng)模式

  • 簡(jiǎn)單工廠(chǎng)模式

  • 工廠(chǎng)方法模式

  • 抽象工廠(chǎng)模式

? 工廠(chǎng)顧名思義就是生產(chǎn)產(chǎn)品的意思,根據(jù)產(chǎn)品是具體產(chǎn)品還是具體工廠(chǎng)可分為簡(jiǎn)單工廠(chǎng)模式和工廠(chǎng)方法模式困檩,根據(jù)工廠(chǎng)的抽象程度可分為工廠(chǎng)方法模式和抽象工廠(chǎng)模式祠挫。該模式用于封裝和管理對(duì)象的創(chuàng)建,是一種創(chuàng)建型模式悼沿。

1. 簡(jiǎn)單工廠(chǎng)模式

? 首先等舔,我們有一個(gè)服裝制造廠(chǎng),有一張服裝設(shè)計(jì)原稿∠陨颍現(xiàn)在软瞎,我們需要根據(jù)各個(gè)經(jīng)銷(xiāo)商的要求制造出不同顏色的衣服。

  • Clothes接口:即服裝設(shè)計(jì)原稿

    public interface Clothes {
      void getName();
    }
    
  • BlueClothes類(lèi):根據(jù)圖紙制造出來(lái)的藍(lán)色的衣服

    public class BlueClothes implements Clothes{
      public void getName() {
          System.out.print("BlueClothes");
      }
    }
    
  • RedClothes類(lèi):根據(jù)圖紙制造出來(lái)的藍(lán)色的衣服

    public class RedClothes implements Clothes{
      public void getName() {
          System.out.print("RedClothes");
      }
    }
    
  • GreenClothes類(lèi):根據(jù)圖紙制造出來(lái)的藍(lán)色的衣服

    public class GreenClothes implements Clothes{
      public void getName() {
          System.out.print("GreenClothes");
      }
    }
    
  • SimpleClothesFactory類(lèi):一個(gè)簡(jiǎn)單的服裝制造廠(chǎng)

    public class SimpleClothesFactory {
        public Clothes CreateClothes(String orderColor) {
               Clothes Clothes = null;
               if (orderColor.equals("blue")) {
                      Clothes = new BlueClothes();
               } else if (orderColor.equals("red")) {
                      Clothes = new RedClothes();
               } else if (orderColor.equals("green")) {
                      Clothes = new GreenClothes();
               }
               return Clothes;
        }
        //開(kāi)工開(kāi)工
        public static void main(String[] args) {
          SimpleClothesFactory scf = new SimpleClothesFactory();
          scf.CreateClothes("red").getName();
            //拿到紅色的訂單后拉讯,輸出"RedClothes"
        }
    }
    
    

    簡(jiǎn)單工廠(chǎng)模式的優(yōu)點(diǎn):

    • 工廠(chǎng)類(lèi)是整個(gè)模式的關(guān)鍵涤浇。包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類(lèi)的對(duì)象魔慷。通過(guò)使用工廠(chǎng)類(lèi)只锭,外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)象的尷尬局面擺脫出來(lái),僅僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了院尔。而不必管這些對(duì)象究竟如何創(chuàng)建及如何組織的蜻展。明確了各自的職責(zé)和權(quán)利,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化邀摆。

    簡(jiǎn)單工廠(chǎng)模式的缺點(diǎn):

    • 由于工廠(chǎng)類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯纵顾,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠(chǎng)類(lèi)中栋盹;它所能創(chuàng)建的類(lèi)只能是事先考慮到的施逾,如果需要添加新的類(lèi),則就需要改變工廠(chǎng)類(lèi)了例获。
    • 當(dāng)系統(tǒng)中的具體產(chǎn)品類(lèi)不斷增多時(shí)候汉额,可能會(huì)出現(xiàn)要求工廠(chǎng)類(lèi)根據(jù)不同條件創(chuàng)建不同實(shí)例的需求。這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類(lèi)型的判斷交錯(cuò)在一起榨汤,很難避免模塊功能的蔓延蠕搜,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利。
    • 這些缺點(diǎn)在工廠(chǎng)方法模式中得到了一定的克服收壕。

    可以考慮的應(yīng)用場(chǎng)景:

    • 工廠(chǎng)類(lèi)負(fù)責(zé)創(chuàng)建的對(duì)象比較少妓灌;
    • 客戶(hù)只知道傳入工廠(chǎng)類(lèi)的參數(shù)轨蛤,對(duì)于如何創(chuàng)建對(duì)象(邏輯)不關(guān)心;
    • 由于簡(jiǎn)單工廠(chǎng)很容易違反高內(nèi)聚責(zé)任分配原則虫埂,因此一般只在很簡(jiǎn)單的情況下應(yīng)用俱萍。

2. 工廠(chǎng)方法模式

? 那么問(wèn)題來(lái)了,在我們使用簡(jiǎn)單工廠(chǎng)模式時(shí)告丢,當(dāng)我們的服裝廠(chǎng)生意做大了,吸引了無(wú)數(shù)經(jīng)銷(xiāo)商前來(lái)訂單损谦,這時(shí)我們廠(chǎng)里只能生產(chǎn)紅岖免、綠、藍(lán)顏色的衣服照捡。如果我們想要接下這批訂單颅湘,那我們就要對(duì)原工廠(chǎng)進(jìn)行改造,那就會(huì)消耗大量的人力物力了栗精。這時(shí)闯参,工廠(chǎng)方法模式就登場(chǎng)了!

  • Clothes接口:服裝設(shè)計(jì)原稿

  • YellowClothes類(lèi):按稿件設(shè)計(jì)出來(lái)的黃色衣服

  • WhiteClothes類(lèi):按稿件設(shè)計(jì)出來(lái)的白色衣服

  • ClothesFactory接口:服裝廠(chǎng)原型悲立,建造具體服裝廠(chǎng)時(shí)的標(biāo)準(zhǔn)

  • YellowClothesFactory類(lèi):生產(chǎn)黃色衣服的工廠(chǎng)

  • WhiteClothesFactory類(lèi):生產(chǎn)白色衣服的工廠(chǎng)

  • Work類(lèi):工廠(chǎng)開(kāi)工(啟動(dòng)類(lèi))

    interface Clothes{
        void showTag();
    }
    
    class YellowClothes implements Clothes{
      public void showTag() {
          System.out.println("YellowClothes");
      }
    }
    
    class WhiteClothes implements Clothes{
      public void showTag() {
          System.out.println("WhiteClothes");
      }
    }
    
    interface ClothesFactory{
        public abstract Clothes produce();
    }
    
    class YellowClothesFactory implements ClothesFactory{
      public Clothes produce() {
          return new YellowClothes();
      }
    }
    
    class WhiteClothesFactory implements ClothesFactory{
      public Clothes produce() {
          return new WhiteClothes();
      }
    }
    
    public class Work {
      public static void main(String[] args){
          ClothesFactory ycf = new YellowClothesFactory();
          ycf.produce().showTag();
          //輸出YellowClothes
          ClothesFactory wcf = new WhiteClothesFactory();
            wcf.produce().showTag();
            //輸出WhiteClothes
        }
    }
    

? 如此這般鹿寨,在我們接受到新訂單時(shí)我們只需要新建一個(gè)小工廠(chǎng)就可以了。不需要對(duì)建好的工廠(chǎng)進(jìn)行改造薪夕。它能更好的符合開(kāi)閉原則的要求脚草。

工廠(chǎng)方法模式的優(yōu)點(diǎn):

  • 用戶(hù)只需要關(guān)心產(chǎn)品對(duì)應(yīng)的工廠(chǎng),甚至無(wú)需關(guān)心創(chuàng)建細(xì)節(jié)或具體產(chǎn)品類(lèi)的類(lèi)名原献。
  • 基于工廠(chǎng)角色和產(chǎn)品的多態(tài)性設(shè)計(jì)是工廠(chǎng)模式的關(guān)鍵馏慨。它能自主決定如何創(chuàng)建哪種產(chǎn)品對(duì)象,而創(chuàng)建細(xì)節(jié)都封裝在具體工廠(chǎng)內(nèi)部姑隅。
  • 在系統(tǒng)要添加新的產(chǎn)品時(shí)写隶,無(wú)需修改抽象工廠(chǎng)和抽象產(chǎn)品提供的接口,無(wú)需修改客戶(hù)端讲仰,也無(wú)需修改其他的具體工廠(chǎng)和具體產(chǎn)品慕趴,只要添加一個(gè)具體工廠(chǎng)和具體產(chǎn)品即可,從而提高系統(tǒng)的可擴(kuò)展性(符合開(kāi)閉原則)

工廠(chǎng)方法模式的缺點(diǎn):

  • 在添加新產(chǎn)品時(shí)叮盘,要編寫(xiě)新的具體產(chǎn)品類(lèi)秩贰,并要提供與之對(duì)應(yīng)的具體工廠(chǎng)類(lèi)。系統(tǒng)軟件個(gè)數(shù)也成對(duì)增加柔吼,從而增加了系統(tǒng)的復(fù)雜度毒费,帶來(lái)更多開(kāi)銷(xiāo)。
  • 由于系統(tǒng)的可擴(kuò)展性愈魏,在客戶(hù)端中要引入抽象層進(jìn)行定義觅玻,從而增加了系統(tǒng)的抽象性和理解難度想际。

3. 抽象工廠(chǎng)模式

? 工廠(chǎng)模式中的每一個(gè)形態(tài)都是針對(duì)一定問(wèn)題的解決方案,工廠(chǎng)方法針對(duì)的是多個(gè)產(chǎn)品系列結(jié)構(gòu)溪厘;而抽象工廠(chǎng)模式針對(duì)的是多個(gè)產(chǎn)品族結(jié)構(gòu)胡本,一個(gè)產(chǎn)品族內(nèi)有多個(gè)產(chǎn)品系列。

讓我們回到我們的服裝廠(chǎng)繼續(xù)分析畸悬,現(xiàn)在侧甫,我們已經(jīng)不滿(mǎn)足于衣服業(yè)務(wù)啦,我們要進(jìn)軍褲子生產(chǎn)屆蹋宦,那么問(wèn)題來(lái)了披粟,我們只有衣服生產(chǎn)廠(chǎng),怎么辦呢冷冗?我們現(xiàn)在迫切需要一種多個(gè)產(chǎn)品族結(jié)構(gòu)的解決方案守屉。

  • Clothes接口:衣服設(shè)計(jì)原稿

  • YellowClothes類(lèi):按稿件設(shè)計(jì)出來(lái)的黃色衣服

  • WhiteClothes類(lèi):按稿件設(shè)計(jì)出來(lái)的白色衣服

  • Trousers接口:褲子設(shè)計(jì)原稿

  • YellowTrousers類(lèi):按稿件設(shè)計(jì)出來(lái)的黃色褲子

  • WhiteTrousers類(lèi):按稿件設(shè)計(jì)出來(lái)的白色褲子

  • AbstractFactory抽象類(lèi):服裝廠(chǎng)原型,建造具體服裝廠(chǎng)時(shí)的標(biāo)準(zhǔn)

  • YellowFactory類(lèi):擁有黃色原料的工廠(chǎng)

  • WhiteFactory類(lèi):擁有白色原料的工廠(chǎng)

  • Work類(lèi):工廠(chǎng)開(kāi)工(啟動(dòng)類(lèi))

    //衣服原稿
    interface Clothes{
        void showClothesTag();
    }
    //褲子原稿
    interface Trousers{
      void showTrousersTag();
    }
    
    //衣服原稿制作出來(lái)的黃色衣服
    class YellowClothes implements Clothes{
      public void showClothesTag() {
          System.out.println("YellowClothes");
      }
    }
    //衣服原稿制作出來(lái)的白色衣服
    class WhiteClothes implements Clothes{
      public void showClothesTag() {
          System.out.println("WhiteClothes");
      }
    }
    
    //衣服原稿制作出來(lái)的黃色褲子
    class YellowTrousers implements Trousers{
      public void showTrousersTag() {
          System.out.println("YellowTrousers");
      }
    }
    //衣服原稿制作出來(lái)的白色褲子
    class WhiteTrousers implements Trousers{
      public void showTrousersTag() {
          System.out.println("WhiteTrousers");
      }
    }
    
    //能生產(chǎn)衣服和褲子的工廠(chǎng)
    abstract class AbstractFactory{
      public abstract Clothes produceClothes();   
      public abstract Trousers produceTrousers();      
    }
    
    //擁有黃色原料的工廠(chǎng)
    class YellowFactory extends AbstractFactory{    
      public Clothes produceClothes() {        
          return new YellowClothes();    
      }    
      public Trousers produceTrousers() {        
          return new YellowTrousers();    
      }
    }
    //擁有白色原料的工廠(chǎng)
    class WhiteFactory extends AbstractFactory{    
      public Clothes produceClothes() {        
          return new WhiteClothes();    
      }    
      public Trousers produceTrousers() {        
          return new WhiteTrousers();    
      }
    }
    
    //啟動(dòng)類(lèi)
    public class Work {
      public static void main(String[] args) {
          AbstractFactory yf = new YellowFactory();
          AbstractFactory wf = new WhiteFactory();
          System.out.println("黃色原料工廠(chǎng)正在生產(chǎn):");
          yf.produceClothes().showClothesTag();
          yf.produceTrousers().showTrousersTag();
          System.out.println("白色原料工廠(chǎng)正在生產(chǎn):");
          wf.produceClothes().showClothesTag();
          wf.produceTrousers().showTrousersTag();
      }
    }
    

    如此這般蒿辙,我們就可以正式進(jìn)軍褲子制造屆啦拇泛。

    抽象工廠(chǎng)模式的優(yōu)點(diǎn):

    • 分離了具體的類(lèi)∷脊啵客戶(hù)通過(guò)抽象接口操縱實(shí)例俺叭,產(chǎn)品的類(lèi)名也在具體工廠(chǎng)的實(shí)現(xiàn)中被分離,它們不出現(xiàn)在客戶(hù)代碼中习瑰。
    • 易于交換產(chǎn)品系列绪颖。一個(gè)具體工廠(chǎng)類(lèi)只在初始化時(shí)出現(xiàn)一次,這使得改變一個(gè)應(yīng)用的具體工廠(chǎng)變得很容易甜奄,只需改變具體的工廠(chǎng)即可使用不同的產(chǎn)品配置柠横。
    • 有利于產(chǎn)品的一致性。當(dāng)一個(gè)系列的產(chǎn)品對(duì)象被設(shè)計(jì)成一起工作時(shí)课兄,一個(gè)應(yīng)用一次只能使用同一個(gè)系列中的對(duì)象牍氛,這一點(diǎn)很重要,而抽象工廠(chǎng)很容易實(shí)現(xiàn)這一點(diǎn)烟阐。

    抽象工廠(chǎng)模式的缺點(diǎn):

    • 難以支持新種類(lèi)的產(chǎn)品搬俊。因?yàn)槌橄蠊S(chǎng)接口確定了可以被創(chuàng)建的產(chǎn)品集合,所以難以擴(kuò)展抽象工廠(chǎng)以生產(chǎn)新種類(lèi)的產(chǎn)品蜒茄。

    可以考慮使用的場(chǎng)景:

    • 一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建唉擂、組合和表示時(shí)。
    • 一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來(lái)配置時(shí)檀葛。
    • 需要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)玩祟。
    • 提供一個(gè)產(chǎn)品類(lèi)庫(kù),而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)屿聋。

以上就是我對(duì)這三個(gè)模式的簡(jiǎn)單認(rèn)識(shí)啦空扎,也是作為個(gè)人的學(xué)習(xí)總結(jié)藏鹊,僅供參考!

如有錯(cuò)誤转锈,萬(wàn)望指正盘寡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市撮慨,隨后出現(xiàn)的幾起案子竿痰,更是在濱河造成了極大的恐慌,老刑警劉巖砌溺,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件于未,死亡現(xiàn)場(chǎng)離奇詭異杨名,居然都是意外死亡稠肘,警方通過(guò)查閱死者的電腦和手機(jī)斥黑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)弟胀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)楷力,“玉大人,你說(shuō)我怎么就攤上這事孵户∠舫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵夏哭,是天一觀(guān)的道長(zhǎng)检柬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)竖配,這世上最難降的妖魔是什么何址? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮进胯,結(jié)果婚禮上用爪,老公的妹妹穿的比我還像新娘。我一直安慰自己胁镐,他們只是感情好偎血,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著盯漂,像睡著了一般颇玷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上就缆,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天帖渠,我揣著相機(jī)與錄音,去河邊找鬼违崇。 笑死阿弃,一個(gè)胖子當(dāng)著我的面吹牛诊霹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渣淳,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脾还,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了入愧?” 一聲冷哼從身側(cè)響起鄙漏,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棺蛛,沒(méi)想到半個(gè)月后怔蚌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旁赊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年桦踊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片终畅。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡籍胯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出离福,到底是詐尸還是另有隱情杖狼,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布妖爷,位于F島的核電站蝶涩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏絮识。R本人自食惡果不足惜绿聘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望次舌。 院中可真熱鬧斜友,春花似錦、人聲如沸垃它。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)国拇。三九已至洛史,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酱吝,已是汗流浹背也殖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忆嗜。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓己儒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捆毫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闪湾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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