理解工廠模式

概念理解

工廠模式是一種創(chuàng)建型模式,統(tǒng)一創(chuàng)建對象饮六,供客戶端使用其垄。客戶端僅需從工廠中取對象卤橄,而不用關(guān)心創(chuàng)建對象的邏輯绿满。

實例描述

以西餐廳制作披薩為例,西餐廳目前提供披薩種類有cheese pizza,pepper pizza,bacon pizza窟扑,點餐系統(tǒng)需要根據(jù)客戶要求不同喇颁,制作不同的pizza。

直接實現(xiàn):

在不使用任何模式的情況下嚎货,類的結(jié)構(gòu)大致是這樣的


public abstract class Pizza {

    private String name ;
    public Pizza(String name){
        this.name = name;
    }

    public abstract void  prepare();
    public void bake(){
        System.out.println(name+" is baked");
    }
    public void cut(){
        System.out.println(name+" is cut");
    }
    public void box(){
        System.out.println(name+" is boxed");
    }

    public String getName() {
        return name;
    }
}
public class BaconPizza extends Pizza {

    public BaconPizza(){
        super("baconPizza");
    }

    @Override
    public void prepare() {
        System.out.println(getName()+"is prepared");
    }
}
public class RestaurantClient {
    public void  createPizza(String type){
        Pizza pizza = null;
        if("cheese".equals(type)){
            pizza =  new CheesePizza();
        }else if ("bacon".equals(type)){
            pizza=new  BaconPizza();
        }else if("pepper".equals(type)){
            pizza=new  PepperPizza();
        }

        if(pizza !=null){
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}

缺點:這種直接的結(jié)構(gòu)是客戶端以if else的方式創(chuàng)建不同類橘霎,客戶端必須關(guān)注類是如何創(chuàng)建的,如果新加入一個新的品種殖属,客戶端需要重新改造代碼姐叁,加入新的品種。這種緊耦合的方式洗显,違背了開放封閉原則外潜。

設(shè)計一:簡單工廠模式

簡單工廠模式僅僅是把變化的部分獨立出來,客戶端僅需要關(guān)注業(yè)務(wù)挠唆,無需關(guān)注對象是如何創(chuàng)建的处窥。


public class PizzaFactory {

public static Pizza createPizza(String type){
    Pizza pizza = null;
    if("cheese".equals(type)){
        pizza =  new CheesePizza();
    }else if ("bacon".equals(type)){
        pizza=new BaconPizza();
    }else if("pepper".equals(type)){
        pizza=new PepperPizza();
    }
    return pizza;
}

}

public class RestaurantClient {
    public void  productPizza(String type){
       Pizza pizza = PizzaFactory.createPizza(type);
        if(pizza !=null){
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}

優(yōu)點:將創(chuàng)建對象的功能獨立出來,客戶端僅需關(guān)注業(yè)務(wù)玄组,無需關(guān)注對象的創(chuàng)建邏輯
缺點:工廠類中包含了所有類的創(chuàng)建滔驾,違反了高內(nèi)聚的單一職責(zé)原則,不利于擴展俄讹。

設(shè)計二:工廠方法模式

避免簡單工廠模式的缺點哆致,核心工廠抽象為一個接口,將對象實例化交給具體工廠子類患膛,核心工廠僅給出創(chuàng)建必須實現(xiàn)的接口沽瞭,不再關(guān)注對象的具體實例化邏輯。具體工廠各司其職,給出具體的創(chuàng)建對象邏輯驹溃。


public interface IPizzaFactory {
    Pizza createPizza();
}
public class BaconPizzaFactory implements IPizzaFactory {
    @Override
    public Pizza createPizza() {
        return new BaconPizza();
    }
}
public class RestaurantClient {
    public void  createPizza(String type){
       IPizzaFactory factory =null;
        if("cheese".equals(type)){
            factory =  new CheesePizzaFactory();
        }else if ("bacon".equals(type)){
            factory=new BaconPizzaFactory();
        }else if("pepper".equals(type)){
            factory=new PepperPizzaFactory();
        }
        Pizza pizza = factory.createPizza();
        if(pizza !=null){
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}
設(shè)計三

當(dāng)西餐廳加入了新的產(chǎn)品類別-飲料時,就用到了抽象工廠模式延曙。抽象工廠管理了多個品類的抽象創(chuàng)建方法豌鹤,同時設(shè)計一個工廠構(gòu)造器來創(chuàng)建具體的工廠。


public interface IFactory {
    Pizza createPizza();
    Drink createDrink();
}
public class BaconFactory implements  IFactory{

    @Override
    public Pizza createPizza() {
        return new BaconPizza();
    }
    @Override
    public Drink createDrink() {
        return new OrangeDrink();
    }
}
public class FactoryCreator {

    public static IFactory createFactory(String type){
        IFactory factory = null;
        if("cheese".equals(type)){
            factory =  new CheeseFactory();
        }else if ("bacon".equals(type)){
            factory=new BaconFactory();
        }else if("pepper".equals(type)){
            factory=new PepperFactory();
        }
        return factory;
    }
}
public class RestaurantClient {
    public void  createPizza(String type){
        IFactory factory =FactoryCreator.createFactory(type);
        Pizza pizza = factory.createPizza();
        if(pizza !=null){
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
        Drink drink = factory.createDrink();
        if(drink!=null){
            drink.prepare();
            drink.box();
        }
    }
}
注意點

曾經(jīng)對工廠方法模式和抽象工廠模式的概念理解模糊不清枝缔,這里記錄一下:
工廠方法模式是抽象工廠模式一個特例布疙。
工廠方法模式適用于單一品類的工廠實例創(chuàng)建,抽象工廠適用于多種品類的工廠實例創(chuàng)建愿卸,兩種適用場景不同
可以通過反射來構(gòu)造不同的工廠對象灵临,這樣擴展時不要修改工廠構(gòu)造器,改造后實例如下

   public static IFactory createFactory(Class<? extends IFactory> clazz) throws IllegalAccessException, InstantiationException {
      if(clazz !=null){
          IFactory factory =clazz.newInstance();
          return factory;
      }
      return null;
    }

具體實例參見:https://github.com/jxl198/designPattern/tree/master/factory

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趴荸,一起剝皮案震驚了整個濱河市儒溉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌发钝,老刑警劉巖顿涣,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酝豪,居然都是意外死亡涛碑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門孵淘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒲障,“玉大人,你說我怎么就攤上這事瘫证∪嘌郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵痛悯,是天一觀的道長余黎。 經(jīng)常有香客問我,道長载萌,這世上最難降的妖魔是什么惧财? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮扭仁,結(jié)果婚禮上垮衷,老公的妹妹穿的比我還像新娘。我一直安慰自己乖坠,他們只是感情好搀突,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熊泵,像睡著了一般仰迁。 火紅的嫁衣襯著肌膚如雪甸昏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天徐许,我揣著相機與錄音施蜜,去河邊找鬼。 笑死雌隅,一個胖子當(dāng)著我的面吹牛翻默,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恰起,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼修械,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了检盼?” 一聲冷哼從身側(cè)響起肯污,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梯皿,沒想到半個月后仇箱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡东羹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年剂桥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片属提。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡权逗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冤议,到底是詐尸還是另有隱情斟薇,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布恕酸,位于F島的核電站堪滨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蕊温。R本人自食惡果不足惜袱箱,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望义矛。 院中可真熱鬧发笔,春花似錦、人聲如沸凉翻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至前计,卻和暖如春胞谭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背残炮。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工韭赘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人势就。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像脉漏,于是被迫代替她去往敵國和親苞冯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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

  • 設(shè)計模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計原則時需要注意以下幾點:a) 高內(nèi)聚侧巨、低耦合和單一職能的“沖突”實際上舅锄,這兩者...
    彥幀閱讀 3,746評論 0 14
  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用司忱、多...
    MinoyJet閱讀 3,947評論 1 15
  • 第三章 赴約 我們差不多把現(xiàn)場的東西都摸了一遍皇忿,可是并不順利,除了黑色編織袋坦仍,并沒有發(fā)現(xiàn)其他有價值的信息鳍烁,甚至在方...
    天涯書童閱讀 486評論 3 5
  • 《青天白日的狂想》 我和你重新爬上一棵柿子樹 尋找童年的琥珀 找到一棵梨樹下,安穩(wěn)的午睡 等到梨花漫開繁扎。 那時幔荒,南...
    武勝_cff9閱讀 187評論 0 2
  • 酒不多不少 不成醉邊倒 不成胡言篇 不多飲 不多說 不做酒桌鬼 不做酒后悔 不思量不發(fā)言 酒不盡 人不散 感慨不...
    一馬當(dāng)先乎閱讀 206評論 0 4