工廠模式

1、現(xiàn)有一個(gè)水果蔬菜項(xiàng)目嗤军,需要根據(jù)傳參的不同生成不同的水果對(duì)象

2叙赚、以面向?qū)ο蟮脑瓌t設(shè)計(jì)這個(gè)項(xiàng)目

? ? 1)抽象出一個(gè)接口Fruit

? ??public interface Fruit {

????????void get();

????}

? ? 2) 創(chuàng)建接口實(shí)現(xiàn)類Apple震叮、Banana

? ? Banana:

public class Banana implements Fruit {

@Override

? ? public void get() {

System.out.println("This is Banana");

? ? }

}

????Apple:

public class Appleimplements Fruit {

@Override

? ? public void get() {

????????System.out.println("This is Apple");

? ? }

}

????3)創(chuàng)建一個(gè)蔬菜工廠,根據(jù)參數(shù)不同創(chuàng)建不同的水果對(duì)象

public class FruitFactory {

public static Fruit createFruit(String type)throws IllegalAccessException, InstantiationException {

????if(type.equals("apple")){

????????return Apple.class.newInstance();

? ? ? ? }else if(type.equals("banana")){

????????return Banana.class.newInstance();

? ? ? ? }

????????return null;

? ? }

}

? ??4)運(yùn)行

????傳入不同的參數(shù)哲嘲,獲取不同的對(duì)象

public static void main(String[] args)throws InstantiationException, IllegalAccessException {

Fruit apple = FruitFactory.createFruit("apple");

? ? Fruit banana = FruitFactory.createFruit("banana");

? ? apple.get();

? ? banana.get();

}

結(jié)果:

This is Apple

This is Banana

這是典型的簡(jiǎn)單工廠模式眠副,但是這種方式有問題囱怕,若需要新增一個(gè)水果類型光涂,需要修改FruitFactory方法新增個(gè)else if,另外還需新增個(gè)水果類。這就違反了設(shè)計(jì)模式的開放-封閉原則齐佳。接下來我會(huì)采用工廠模式改造這個(gè)項(xiàng)目

3炼吴、利用工廠模式改造項(xiàng)目

? ? 1)在原來的基礎(chǔ)上改造FruitFactory,把FruitFactory抽象成一個(gè)接口

public interface FruitFactory {? ??

????Fruit createFruit();

}

? ? 2)生成一個(gè)抽象工廠的實(shí)現(xiàn)類AppleFactory,里面創(chuàng)建一個(gè)Apple對(duì)象

public class AppleFactroyimplements FruitFactory {

@Override

? ? public FruitcreateFruit() {

????????return new Apple();

? ? }

}

? ? 3)運(yùn)行

public static void main(String[] args) {

FruitFactory appleFactory =new AppleFactroy();

? ? FruitFactory bananaFactory =new BananaFactory();

? ? Fruit apple = appleFactory.createFruit();

? ? Fruit banana = bananaFactory.createFruit();

? ? apple.get();

? ? banana.get();

}

結(jié)果:

This is Apple

This is Banana

利用工廠設(shè)計(jì)模式就解決了之前簡(jiǎn)單工廠模式出現(xiàn)的問題,如果需要新增一個(gè)水果童芹,只需兩步:1假褪、新增水果對(duì)象。2缀遍、新增生成這個(gè)水果對(duì)象的對(duì)應(yīng)的工廠饱须。

4歹苦、工廠模式

? ? 1)定義

? ? ? ?工廠方法模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口殴瘦,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中蚪腋。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建立帖,這樣核心類成為一個(gè)抽象工廠角色晓勇,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品描融。

? ? 2)工廠模式結(jié)構(gòu)圖

? ??

? ? 3)工廠模式的角色和職責(zé)

? ? ? ? 1、抽象工廠角色:工廠方法模式的核心,任何工廠類都必須實(shí)現(xiàn)這個(gè)接口谋右。(抽象工廠角色里包含獲取抽象產(chǎn)品角色的方法)(本例中的抽象工廠角色是FruitFactory)

? ? ? ? 2啸蜜、具體工廠角色:具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn)衬横,負(fù)責(zé)實(shí)例化產(chǎn)品對(duì)象蜂林。(本例中的具體工廠角色是AppleFactory矮锈、BananaFactory)

? ? ? ? 3债朵、抽象產(chǎn)品角色:工廠方法模式所創(chuàng)建的所有對(duì)象的父類序芦,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。(本例中的抽象產(chǎn)品角色是Fruit)

? ? ? ? 4藏杖、具體產(chǎn)品角色:工廠方法模式創(chuàng)建的具體實(shí)例(本例中的具體產(chǎn)品角色是Apple、Banana)

5亮航、工廠模式出現(xiàn)的問題怠苔。

? ? ????看似工廠模式已經(jīng)很好了锅劝,抽象工廠生成出不同的具體產(chǎn)品工廠玻粪,然后具體產(chǎn)品工廠生產(chǎn)出具體的產(chǎn)品伦仍。但是我們思考這樣一個(gè)問題:如果具體產(chǎn)品還能往下分類,例如上例中的蘋果我要分為南方蘋果、北方蘋果娜谊,這時(shí)上面工廠模式就無法解決這個(gè)問題,無法生產(chǎn)出具體的南方蘋果或北方蘋果。這是有人就會(huì)想,我們新建一個(gè)北方蘋果或南方蘋果類鉴竭,在蘋果工廠的獲取蘋果對(duì)象方法上加個(gè)參數(shù),根據(jù)傳入不同參數(shù)的蘋果獲取不同的對(duì)象,但這樣就又出現(xiàn)問題了,這又違反了設(shè)計(jì)模式的基本原則:開放-封閉原則呻拌。新增一個(gè)溫室蘋果的話又要修改蘋果工廠代碼垃喊。那這個(gè)問題我們需要怎么解決呢?接下來引入抽象工廠設(shè)計(jì)模式解決這個(gè)問題。

6他托、利用抽象工廠模式重構(gòu)這個(gè)項(xiàng)目仆葡。

? ? 1)在原有的Apple赏参、Banana類上,改造封裝成抽象類沿盅,形成一個(gè)產(chǎn)品族(蘋果產(chǎn)品族把篓、香蕉產(chǎn)品族)

? ? ? ? 蘋果產(chǎn)品

????public abstract class Apple implements Fruit {? ?}

? ? ? ? 香蕉產(chǎn)品

public abstract class Banana implements Fruit {}

? ? ?2)修改抽象工廠接口,改成獲取產(chǎn)品族對(duì)象腰涧。

public interface FruitFactory {

/**

? ? *? 獲取蘋果實(shí)例

? ? */

? ? FruitgetApple();

? ? /**

? ? * 獲取香蕉實(shí)例

? ? */

? ? FruitgetBanana();

}

? ? 3)具體工廠實(shí)現(xiàn)類

public class NorthFruitFactory implements FruitFactory{

????@Override

? ? public Fruit getApple() {

????????return new NorthApple();

? ? }

????@Override

? ? public Fruit getBanana() {

????????return new NorthBanana();

? ? }

}

? ? 4)具體產(chǎn)品實(shí)習(xí)類NorthApple韧掩、SouthApple

NorthApple

public class NorthAppleextends Apple {

????@Override

? ? public void get() {

????????System.out.println("This is NorthApple");

? ? }

}

????SouthApple

public class SouthAppleextends Apple {

@Override

? ? public void get() {

????????System.out.println("This is SouthApple");

? ? }

}

?5)運(yùn)行

public static void main(String[] args) {

FruitFactory north =new NorthFruitFactory();

? ? Fruit northApple = north.getApple();

? ? Fruit northBanana = north.getBanana();

? ? northApple.get();

? ? northBanana.get();

}

結(jié)果

This is NorthApple

This is NorthBanana

8、抽象工廠模式

? ? 1)定義

? ?????? 抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最其一般性的窖铡。抽象工廠模式可以向客戶端提供一個(gè)接口揍很,使得客戶端在不必指定產(chǎn)品的具體類型的情況下,能夠創(chuàng)建多個(gè)產(chǎn)品族的產(chǎn)品對(duì)象万伤。

? ? 2)抽象工廠模式中的角色和職責(zé)

????????1.抽象工廠(Creator)角色(本例中的抽象工廠角色是FruitFactory)

????????????抽象工廠模式的核心窒悔,包含對(duì)多個(gè)產(chǎn)品結(jié)構(gòu)的聲明,任何工廠類都必須實(shí)現(xiàn)這個(gè)接口敌买。

????????2.具體工廠( Concrete? Creator)角色(本例中的具體工廠角色是NorthFactory)

????????????具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn)简珠,負(fù)責(zé)實(shí)例化某個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象。

????????3.抽象(Product)角色(本例中的抽象角色是Fruit)

????????????抽象模式所創(chuàng)建的所有對(duì)象的父類虹钮,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口聋庵。

????????4.具體產(chǎn)品(Concrete Product)角色(本例中的具體產(chǎn)品角色是SouthApple等)

????????????抽象模式所創(chuàng)建的具體實(shí)例對(duì)象

???????總結(jié):抽象工廠中方法對(duì)應(yīng)產(chǎn)品結(jié)構(gòu),具體工廠對(duì)應(yīng)產(chǎn)品族芙粱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末祭玉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子春畔,更是在濱河造成了極大的恐慌脱货,老刑警劉巖岛都,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異振峻,居然都是意外死亡臼疫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門扣孟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烫堤,“玉大人,你說我怎么就攤上這事凤价「胝澹” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵利诺,是天一觀的道長(zhǎng)湾盗。 經(jīng)常有香客問我,道長(zhǎng)立轧,這世上最難降的妖魔是什么格粪? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮氛改,結(jié)果婚禮上帐萎,老公的妹妹穿的比我還像新娘。我一直安慰自己胜卤,他們只是感情好疆导,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葛躏,像睡著了一般澈段。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舰攒,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天败富,我揣著相機(jī)與錄音,去河邊找鬼摩窃。 笑死兽叮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猾愿。 我是一名探鬼主播鹦聪,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蒂秘!你這毒婦竟也來了泽本?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姻僧,失蹤者是張志新(化名)和其女友劉穎规丽,沒想到半個(gè)月后蒲牧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘁捷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了显熏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雄嚣。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖喘蟆,靈堂內(nèi)的尸體忽然破棺而出缓升,到底是詐尸還是另有隱情,我是刑警寧澤蕴轨,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布港谊,位于F島的核電站,受9級(jí)特大地震影響橙弱,放射性物質(zhì)發(fā)生泄漏歧寺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一棘脐、第九天 我趴在偏房一處隱蔽的房頂上張望斜筐。 院中可真熱鬧,春花似錦蛀缝、人聲如沸顷链。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嗤练。三九已至,卻和暖如春在讶,著一層夾襖步出監(jiān)牢的瞬間煞抬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工构哺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留此疹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓遮婶,卻偏偏與公主長(zhǎng)得像蝗碎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旗扑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 設(shè)計(jì)原則: 要依賴抽象蹦骑,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是抽象工廠模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,114評(píng)論 0 6
  • 一:概念 抽象工廠是工廠方法模式的升級(jí)版本,他用來創(chuàng)建一組相互依賴的對(duì)象臀防。 二: 應(yīng)用說明 正如DEMO abst...
    LikeSomeBody閱讀 500評(píng)論 0 3
  • 工廠模式是我們最常用的實(shí)例化對(duì)象模式了眠菇,是用工廠方法代替new操作的一種模式边败。通常我們所說的工廠模式是指工廠方法模...
    zfylin閱讀 1,314評(píng)論 0 7
  • 簡(jiǎn)單工廠模式 目的是為了符合開發(fā)高內(nèi)聚低耦合。 簡(jiǎn)單工廠模式是類的創(chuàng)建模式捎废,又叫做靜態(tài)工廠方法模式笑窜。簡(jiǎn)單工廠模式由...
    我叫路飛啊閱讀 210評(píng)論 0 0
  • “生活就應(yīng)處于危險(xiǎn)邊緣,你必須反抗登疗,不循規(guī)蹈矩排截,永不止步,拒絕不斷的對(duì)生活和想法視作挑戰(zhàn)辐益,這樣你就能為一個(gè)走鋼...
    瑪格麗特西西子閱讀 1,423評(píng)論 0 1