設(shè)計(jì)模式總結(jié)筆記<二> 工廠模式

文章同步發(fā)放到CSDN博客

工廠模式

工廠模式主要是為創(chuàng)建對(duì)象提供接口,將創(chuàng)建對(duì)象的過(guò)程隔離起來(lái),實(shí)現(xiàn)了創(chuàng)建者與調(diào)用者的分離直晨,提高了程序的靈活性趁啸。
核心本質(zhì):

  • 實(shí)例化對(duì)象,用工廠方法代替new操作垃帅。
  • 將選擇實(shí)現(xiàn)類、創(chuàng)建對(duì)象統(tǒng)一管理和控制,從而將調(diào)用者跟我們實(shí)現(xiàn)類解耦恨胚。

工廠模式分類:

  • 簡(jiǎn)單工廠模式(Simple Factory)
  • 工廠方法模式(Factory Method)
  • 抽象工廠模式(Abstract Factory)

一、簡(jiǎn)單工廠模式

又稱為靜態(tài)工廠方法模式用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的任意產(chǎn)品炎咖,通過(guò) 建立一個(gè)工廠(一個(gè)函數(shù)或一個(gè)類方法)來(lái)制造新的對(duì)象赃泡。
模式組成結(jié)構(gòu):

  • 抽象產(chǎn)品: 它一般是具體產(chǎn)品繼承的父類或者實(shí)現(xiàn)的接口。在java中由接口或者抽象類來(lái)實(shí)現(xiàn)乘盼。

  • 具體產(chǎn)品: 工廠類所創(chuàng)建的對(duì)象就是此角色的實(shí)例升熊。在java中由一個(gè)具體類實(shí)現(xiàn)。

  • 工廠類: 這是本模式的核心绸栅,含有一定的商業(yè)邏輯和判斷邏輯级野。在java中它往往由一個(gè)具體類實(shí)現(xiàn)。

示例代碼

抽象產(chǎn)品:

public interface Car {
     void run();
}

具體產(chǎn)品:

public class Audi implements Car {
     @Override
     public void run() {
        System.out.println("奧迪車!");
    }
}


public class Byd implements  Car {
     @Override
     public void run() {
        System.out.println("比亞迪車粹胯!");
    }
}   

工廠類:

public class SimpleFactory {
     public Car createCar(String type ){
         if("奧迪".equals(type)){
             return new Audi();
        }else if("比亞迪".equals(type)){
             return new Byd();
        }else{
             return null ;
        }
    } 
    }   

客戶類:

public class Customer  {  
     public static void main(String[]  args ) {  
        SimpleFactory factory = new SimpleFactory();  
        Car car1 =factory.createCar("奧迪"); 
        Car car2 =factory.createCar("比亞迪"); 
    }  
     }     

以上便是簡(jiǎn)單工廠模式蓖柔, 但是工廠部分好像不太理想,因?yàn)槊吭黾右环N新型車风纠,都要在工廠類中增加相應(yīng)的創(chuàng)建業(yè)務(wù)邏輯(createCar(String type)方法需要新增case)况鸣,這顯然是違背開(kāi)閉原則的 。可想而知對(duì)于新產(chǎn)品的加入竹观,工廠類是很被動(dòng)的镐捧。對(duì)于這樣的工廠類潜索,我們稱它為全能類或者上帝類。
  于是工廠方法模式出現(xiàn)了懂酱。 工廠類定義成了接口,而每新增的車種類型,就增加該車種類型對(duì)應(yīng)工廠類的實(shí)現(xiàn),這樣工廠的設(shè)計(jì)就可以擴(kuò)展了,而不必去修改原來(lái)的代碼竹习。

二、工廠方法模式

工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象化和推廣玩焰,工廠方法模式里不再只由一個(gè)工廠類決定那一個(gè)產(chǎn)品類應(yīng)當(dāng)被實(shí)例化,這個(gè)決定被交給抽象工廠的子類去做由驹。

模式組成結(jié)構(gòu):

  • 抽象產(chǎn)品: 它一般是具體產(chǎn)品繼承的父類或者實(shí)現(xiàn)的接口。在java中由接口或者抽象類來(lái)實(shí)現(xiàn)昔园。
  • 具體產(chǎn)品: 工廠類所創(chuàng)建的對(duì)象就是此角色的實(shí)例蔓榄。在java中由一個(gè)具體類實(shí)現(xiàn)。
  • 抽象工廠: 這是工廠方法模式的核心默刚,它與應(yīng)用程序無(wú)關(guān)甥郑。是具體工廠角色必須實(shí)現(xiàn)的接口或者必須繼承的父類。在java中它由抽象類或者接口來(lái)實(shí)現(xiàn)荤西。
  • 具體工廠: 它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼澜搅。由應(yīng)用程序調(diào)用以創(chuàng)建對(duì)應(yīng)的具體產(chǎn)品的對(duì)象。

示例代碼

抽象產(chǎn)品與具體產(chǎn)品類代碼與上面相同邪锌。

抽象工廠:

public interface CarFactory    {
    Car createCar(); 
    }   

具體工廠:

public class AudiFactory implements CarFactory {
     @Override
     public Car createCar() {
         return new Audi();
    }
}


public class BydFactory implements CarFactory {
     @Override
     public Car createCar() {
         return new Byd();
    }
}   

客戶類:

public class Customer  {  
     public static void main(String[] args) {
    Car c1 = new AudiFactory().createCar();
    Car c2 = new BydFactory().createCar();            
    }       
    }    

工廠方法模式使用繼承自抽象工廠角色的多個(gè)子類來(lái)代替簡(jiǎn)單工廠模式中的“上帝類”勉躺。正如上面所說(shuō),這樣便分擔(dān)了對(duì)象承受的壓力觅丰;而且這樣使得結(jié)構(gòu)變得靈活 起來(lái)——當(dāng)有新的產(chǎn)品產(chǎn)生時(shí)饵溅,只要按照抽象產(chǎn)品角色、抽象工廠角色提供的合同來(lái)生成妇萄,那么就可以被客戶使用蜕企,而不必去修改任何已有的代 碼」诰洌可以看出工廠角色的結(jié)構(gòu)也是符合開(kāi)閉原則的轻掩!

三、簡(jiǎn)單工廠模式VS工廠方法模式

1 ) 結(jié)構(gòu)復(fù)雜度:簡(jiǎn)單工廠模式優(yōu)勝懦底。
2)代碼復(fù)雜度:簡(jiǎn)單工廠模式占優(yōu)唇牧。
3)管理難度: 工廠方法模式的核心是一個(gè)抽象工廠類,而不像簡(jiǎn)單工廠模式, 把核心放在一個(gè)實(shí)類上【厶疲可拓展性更好丐重,易于管理。

總結(jié):根據(jù)設(shè)計(jì)理論建議用工廠方法模式拱层,但是實(shí)際上弥臼,我們一般都是使用簡(jiǎn)單工廠模式宴咧!

四根灯、抽象工廠模式

在抽象工廠模式中,抽象產(chǎn)品 (AbstractProduct) 可能是一個(gè)或多個(gè),從而構(gòu)成一個(gè)或多個(gè)產(chǎn)品族(Product Family)烙肺。如構(gòu)成一輛車需要有發(fā)動(dòng)機(jī)纳猪,座椅,輪胎等配件桃笙,而每個(gè)配件又有多種(如發(fā)動(dòng)機(jī)有A氏堤,B不同型號(hào)),那么該抽象產(chǎn)品構(gòu)成一個(gè)產(chǎn)品族搏明。
  當(dāng)每個(gè)抽象產(chǎn)品都有多于一個(gè)的具體子類的時(shí)候(發(fā)動(dòng)機(jī)有型號(hào)A和B兩種鼠锈,座椅也有型號(hào)A和B兩種),工廠角色怎么知道實(shí)例化哪一個(gè)子類呢星著?比如每個(gè)抽象產(chǎn)品角色都有兩個(gè)具體產(chǎn)品(產(chǎn)品輪胎有兩個(gè)具體產(chǎn)品輪胎A和輪胎B)购笆。抽象工廠模式提供兩個(gè)具體工廠角色(A型汽車系列工廠和B型系列工廠),分別對(duì)應(yīng)于這兩個(gè)具體產(chǎn)品角色虚循,每一個(gè)具體工廠角色只負(fù)責(zé)某一個(gè)產(chǎn)品角色的實(shí)例化同欠。每一個(gè)具體工廠類只負(fù)責(zé)創(chuàng)建抽象產(chǎn)品的某一個(gè)具體子類的實(shí)例。

示例代碼
不同的抽象產(chǎn)品族:

/**
 * 發(fā)動(dòng)機(jī)接口及具體子類
 */
public interface Engine {
    void run();
}
class EngineA implements Engine{
    @Override
    public void run() {
        System.out.println("轉(zhuǎn)的快横缔!");
    }
}
class EngineB implements Engine{

    @Override
    public void run() {
        System.out.println("轉(zhuǎn)的慢铺遂!");
    } 
}  

/**
 * 座椅接口及具體子類
 */
public interface Seat {
    void massage();
}
class LuxurySeat implements Seat {
    @Override
    public void massage() {
        System.out.println("可以自動(dòng)按摩!");
    }

}
class LowSeat implements Seat {
    @Override
    public void massage() {
        System.out.println("不能按摩茎刚!");
    }

}  

不同的工廠:

//汽車工廠接口
public interface CarFactory {
    Engine createEngine();
    Seat createSeat();
}

//A類汽車工廠
public class CarFactoryA implements CarFactory {
    @Override
    public Engine createEngine() {
        return new EngineA();
    }
    @Override
    public Seat createSeat() {
        return new SeatA();
    }
}

//B類汽車工廠
public class CarFactoryB implements CarFactory {
    @Override
    public Engine createEngine() {
        return new EngineB();
    }
    @Override
    public Seat createSeat() {
        return new SeatB();
    }
}  

客戶:

public class Customer {
    public static void main(String[] args) {
      //得到不同配件構(gòu)成的汽車
        CarFactory  factory1 = new CarFactoryA();
        Engine e = factory1.createEngine();
        Seat s=factory1.createSeat();

        CarFactory  factory2 = new CarFactoryB();
        Engine e1= factory2.createEngine();
        Seat s1=factory2.createSeat();
    }
}  

抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口襟锐,而無(wú)須指定他們具體的類。它針對(duì)的是有多個(gè)產(chǎn)品的等級(jí)結(jié)構(gòu)斗蒋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捌斧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泉沾,更是在濱河造成了極大的恐慌捞蚂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跷究,死亡現(xiàn)場(chǎng)離奇詭異姓迅,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)俊马,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)丁存,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人柴我,你說(shuō)我怎么就攤上這事解寝。” “怎么了艘儒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵聋伦,是天一觀的道長(zhǎng)夫偶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)觉增,這世上最難降的妖魔是什么兵拢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮逾礁,結(jié)果婚禮上说铃,老公的妹妹穿的比我還像新娘。我一直安慰自己嘹履,他們只是感情好腻扇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著砾嫉,像睡著了一般衙解。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焰枢,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天蚓峦,我揣著相機(jī)與錄音,去河邊找鬼济锄。 笑死暑椰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荐绝。 我是一名探鬼主播一汽,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼低滩!你這毒婦竟也來(lái)了召夹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恕沫,失蹤者是張志新(化名)和其女友劉穎监憎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體婶溯,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲸阔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迄委。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐筛。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叙身,靈堂內(nèi)的尸體忽然破棺而出渔扎,到底是詐尸還是另有隱情,我是刑警寧澤信轿,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布晃痴,位于F島的核電站妓忍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏愧旦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一定罢、第九天 我趴在偏房一處隱蔽的房頂上張望笤虫。 院中可真熱鬧,春花似錦祖凫、人聲如沸琼蚯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遭庶。三九已至,卻和暖如春稠屠,著一層夾襖步出監(jiān)牢的瞬間峦睡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工权埠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榨了,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓攘蔽,卻偏偏與公主長(zhǎng)得像龙屉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子满俗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 工廠模式是我們最常用的實(shí)例化對(duì)象模式了转捕,是用工廠方法代替new操作的一種模式。通常我們所說(shuō)的工廠模式是指工廠方法模...
    zfylin閱讀 1,314評(píng)論 0 7
  • 創(chuàng)建型模式 工廠模式 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一唆垃。這種類型的設(shè)...
    liuyang7519閱讀 327評(píng)論 0 2
  • 我圍爐心間的熱 寒冬里的冷事 灼燒著我的面頰 窺探春暖 這冬天的陽(yáng)光 是去年三月天空的回響 那冷風(fēng)里也夾有夏日的溫...
    公子三壽閱讀 212評(píng)論 0 3
  • 編輯mysql的配置文件: sudo vim /etc/mysql/mysql.conf.d/mysqld.cn...
    IT的咸魚(yú)閱讀 344評(píng)論 0 1
  • 2013年8月16日五芝,發(fā)生了A股歷史上的奇觀,大盤(pán)出現(xiàn)巨幅波動(dòng)辕万,讓我們回顧一下基本過(guò)程: 11點(diǎn)05分31秒--中...
    火山哥2閱讀 202評(píng)論 0 1