【抽象工廠模式】Abstract Factory Design Pattern

Abstract_Factory.png

抽象工廠模式

  • 抽象工廠模式是**Creational **模式之一
  • 抽象工廠模式和工廠模式很相似尔破,甚至可以說抽象工廠模式是產(chǎn)生工廠的工廠模式
  • 熟悉工廠模式的同學(xué)知道携丁,在工廠模式中我們使用If-else對(duì)輸入?yún)?shù)進(jìn)行判斷然后生產(chǎn)不同的實(shí)例對(duì)象
  • 而在抽象工廠模式中我們卻不這樣做平酿,我們會(huì)對(duì)每一個(gè)子類創(chuàng)建一個(gè)工廠專用于產(chǎn)生此類對(duì)象
  • 比如:下圖中的汽車門在工廠模式中我們可能只有一個(gè)工廠類名為:CarStampFactory()然后根據(jù)不同的輸入返回不同的對(duì)象:StampRightDoor筛武,StampLeftDoor,StampHood等搜变。
    而使用抽象工廠模式孟岛,就為每一個(gè)汽車配件創(chuàng)造一個(gè)工廠:
    StampRightDoorFactory,StampLeftDoorFactory,StampHoodFactory瓶竭,各工廠只做一件事情督勺,只產(chǎn)生自家工廠的配件。
Abstract_Factory_example.png

創(chuàng)建抽象工廠的步驟:

第一步:創(chuàng)建Super Classs 和 Sub Class:

--需要被Client大量使用的類和對(duì)象
--Super Class 可以為接口 在验,抽象類或是正常的類
--Sub Class 實(shí)現(xiàn)或者繼承自父類玷氏,然后個(gè)性化自己

  • Computer.java
    <code>
    package com.journaldev.design.model;

public abstract class Computer {

public abstract String getRAM();
public abstract String getHDD();
public abstract String getCPU();
  
@Override
public String toString(){
    return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
}

}
</code>

  • PC.java
    <code>
    package com.journaldev.design.model;

public class PC extends Computer {

private String ram;
private String hdd;
private String cpu;
  
public PC(String ram, String hdd, String cpu){
    this.ram=ram;
    this.hdd=hdd;
    this.cpu=cpu;
}
@Override
public String getRAM() {
    return this.ram;
}

@Override
public String getHDD() {
    return this.hdd;
}

@Override
public String getCPU() {
    return this.cpu;
}

}
</code>

  • Server.java
    <code>
    package com.journaldev.design.model;

public class Server extends Computer {

private String ram;
private String hdd;
private String cpu;
  
public Server(String ram, String hdd, String cpu){
    this.ram=ram;
    this.hdd=hdd;
    this.cpu=cpu;
}
@Override
public String getRAM() {
    return this.ram;
}

@Override
public String getHDD() {
    return this.hdd;
}

@Override
public String getCPU() {
    return this.cpu;
}

}
</code>

第二步:創(chuàng)建Abstract Factory Class

  • ComputerAbstractFactory.java
    <code>
    package com.journaldev.design.abstractfactory;
    import com.journaldev.design.model.Computer;
    public interface ComputerAbstractFactory {
    public Computer createComputer();
    }
    </code>
  • 注意: 此處返回 頂級(jí)父類:Computer,依據(jù)java的泛型特性腋舌,可以返回很多Computer的子類盏触,具有很好的擴(kuò)展性

第三步:創(chuàng)建個(gè)Sub Class 的工廠方法

  • PCFactory.java
    <code>
    package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;

public class PCFactory implements ComputerAbstractFactory {

private String ram;
private String hdd;
private String cpu;
 
public PCFactory(String ram, String hdd, String cpu){
    this.ram=ram;
    this.hdd=hdd;
    this.cpu=cpu;
}
@Override
public Computer createComputer() {
    return new PC(ram,hdd,cpu);
}

}
Similarly
</code>
同樣的我們?cè)賱?chuàng)建 ServerFactory.java

  • ServerFactory.java
    <code>
    package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.Server;

public class ServerFactory implements ComputerAbstractFactory {

private String ram;
private String hdd;
private String cpu;
 
public ServerFactory(String ram, String hdd, String cpu){
    this.ram=ram;
    this.hdd=hdd;
    this.cpu=cpu;
}
 
@Override
public Computer createComputer() {
    return new Server(ram,hdd,cpu);
}

}
</code>
.....根據(jù)需求我們還能創(chuàng)建很多的Factory類.....

第四步:創(chuàng)建一個(gè) consumer class 作為入口供Client調(diào)用

  • ComputerFactory.java
    <code>
    package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;

public class ComputerFactory {
public static Computer getComputer(ComputerAbstractFactory factory){
return factory.createComputer();
}
}
</code>

  • ** 注意:其實(shí)我覺得這一步完全沒有必要用,有點(diǎn)多余块饺。**

第五步:測試程序

  • TestDesignPatterns.java
    <code>
    package com.journaldev.design.test;
    import com.journaldev.design.abstractfactory.PCFactory;
    import com.journaldev.design.abstractfactory.ServerFactory;
    import com.journaldev.design.factory.ComputerFactory;
    import com.journaldev.design.model.Computer;
    public class TestDesignPatterns {
    public static void main(String[] args) {
    testAbstractFactory(); }
    private static void testAbstractFactory() {
    Computer pc = ComputerFactory.getComputer(new PCFactory("2 GB","500 GB","2.4 GHz"));
    Computer server = ComputerFactory.getComputer(new ServerFactory("16 GB","1 TB","2.9 GHz"));
    System.out.println("AbstractFactory PC Config::"+pc);
    System.out.println("AbstractFactory Server Config::"+server);
    }
    }
    </code>

一張模型圖

class diagram.png

總結(jié)&&抽象工廠模式的好處

  • 具有工廠模式的所有好處
  • 比傳統(tǒng)工廠模式更具有拓展性
  • 抽象工廠即工廠中的工廠
  • 通俗理解:
    以前我家有一個(gè)包子店赞辩,每天會(huì)生產(chǎn)很多的包子:肉包,菜包和糖包授艰,因?yàn)槲业陌涌煽诤贸员嫠裕刻靵碣I包子的人就越來越多,這樣的一個(gè)包子鋪忙不過來淮腾。然后我把包子鋪拆分為三個(gè)小包子鋪:分別生產(chǎn)肉包糟需,菜包和糖包,這樣問題解決了谷朝,效率也上去了洲押,我掙得錢也越來越多了。
  • 這就是所謂的分工
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圆凰,一起剝皮案震驚了整個(gè)濱河市杈帐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌专钉,老刑警劉巖挑童,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跃须,居然都是意外死亡站叼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門菇民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尽楔,“玉大人,你說我怎么就攤上這事玉雾。” “怎么了轻要?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵复旬,是天一觀的道長。 經(jīng)常有香客問我冲泥,道長驹碍,這世上最難降的妖魔是什么壁涎? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮志秃,結(jié)果婚禮上怔球,老公的妹妹穿的比我還像新娘。我一直安慰自己浮还,他們只是感情好竟坛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钧舌,像睡著了一般担汤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洼冻,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天崭歧,我揣著相機(jī)與錄音,去河邊找鬼撞牢。 笑死率碾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屋彪。 我是一名探鬼主播所宰,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼撼班!你這毒婦竟也來了歧匈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤砰嘁,失蹤者是張志新(化名)和其女友劉穎件炉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矮湘,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斟冕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缅阳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磕蛇。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖十办,靈堂內(nèi)的尸體忽然破棺而出秀撇,到底是詐尸還是另有隱情,我是刑警寧澤向族,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布呵燕,位于F島的核電站,受9級(jí)特大地震影響件相,放射性物質(zhì)發(fā)生泄漏再扭。R本人自食惡果不足惜氧苍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泛范。 院中可真熱鬧让虐,春花似錦、人聲如沸罢荡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柠傍。三九已至麸俘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惧笛,已是汗流浹背从媚。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留患整,地道東北人拜效。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像各谚,于是被迫代替她去往敵國和親紧憾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

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

  • 什么是工廠模式 工廠模式是一種廣泛使用的設(shè)計(jì)模式昌渤,被廣泛使用與JDK和一些框架中赴穗,比如著名的Spring和Stru...
    jackLee閱讀 1,055評(píng)論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法膀息,內(nèi)部類的語法般眉,繼承相關(guān)的語法,異常的語法潜支,線程的語...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理甸赃,服務(wù)發(fā)現(xiàn),斷路器冗酿,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,805評(píng)論 0 11
  • 結(jié)合簡單示例和UML圖,講解工廠模式簡單原理臣嚣。 一、引子 話說十年前剥哑,有一個(gè)爆發(fā)戶硅则,他家有三輛汽車(Benz(奔馳...
    某人在閱讀 1,347評(píng)論 1 6