設(shè)計(jì)模式-工廠模式淺析

概述

先照搬書(shū)上工廠模式的定義薛训,即定義一個(gè)用于創(chuàng)建對(duì)象的接口恨旱,讓子類決定實(shí)例化哪一個(gè)類,工廠方法使一個(gè)類的實(shí)例化延遲到其子類坝疼。工廠模式一共有三個(gè)小分類搜贤,分別是:簡(jiǎn)單工廠模式,工廠方法模式和抽象工廠模式钝凶。使用工廠模式一定有他的好處仪芒,那么具體好處是啥呢?我認(rèn)為3個(gè)工廠模式有不同的好處耕陷,當(dāng)然他們也不是完美無(wú)缺的掂名。下面我們簡(jiǎn)單介紹3類工廠模式。

簡(jiǎn)單工廠模式

通過(guò)一個(gè)工廠哟沫,產(chǎn)生不同的產(chǎn)品饺蔑。如下代碼所示。

/**
 * 產(chǎn)品接口
 */
public interface Product {
  void use();
}

/**
 * A產(chǎn)品
 */
public class ProductA implements Product {
  public void use() {
    System.out.println("use ProductA");
  }
}

/**
 * B產(chǎn)品
 */
public class ProductB implements Product {
  public void use() {
    System.out.println("use ProductB");
  }
}

/**
 * 簡(jiǎn)單工廠
 */
public class Factory {
  public Product createProduct(String category) {
    switch(category) {
      case "A":
        return new ProductA();
      case "B":
        return new ProductB();
      default:
        return null;
    }
  }
}

通過(guò)工廠類嗜诀,客戶可以根據(jù)不同的參數(shù)猾警,就能“拿到”想要的產(chǎn)品,不用自己生產(chǎn)一個(gè)隆敢。

簡(jiǎn)單工廠實(shí)際應(yīng)用舉例

  • JDK類庫(kù)中廣泛使用了簡(jiǎn)單工廠模式
    如工具類java.text.DateFormat发皿,它用于格式化一個(gè)本地日期或者時(shí)間。
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale
locale);
  • Java加密技術(shù)
    獲取不同加密算法的密鑰生成器:
KeyGenerator keyGen=KeyGenerator.getInstance("DESede");

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

  • 將對(duì)象的創(chuàng)建和使用分離拂蝎,客戶不用關(guān)心產(chǎn)品的實(shí)例化細(xì)節(jié)穴墅,起到了責(zé)任分割和降低耦合的作用。

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

  • 每增加一種產(chǎn)品温自,就要修改工廠的邏輯玄货,在產(chǎn)品數(shù)量眾多,且類型復(fù)雜的情況下捣作,可能難以修改和維護(hù)誉结。
  • 工廠負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,責(zé)任重大券躁,一旦不能正常工作惩坑,整個(gè)系統(tǒng)就無(wú)法正常工作掉盅。

簡(jiǎn)單工廠適用場(chǎng)景

產(chǎn)品種類較少時(shí),或者客戶只知道產(chǎn)品種類的參數(shù)以舒,并不關(guān)心如何產(chǎn)生的情況下趾痘,可以使用簡(jiǎn)單工廠模式。

工廠方法模式

工廠方法模式不再使用一個(gè)工廠完成所有產(chǎn)品的生產(chǎn)蔓钟,而是由特定工廠負(fù)責(zé)特定產(chǎn)品的生產(chǎn)永票,當(dāng)我們需要新增某類產(chǎn)品的時(shí)候,只需要實(shí)現(xiàn)對(duì)應(yīng)產(chǎn)品的生產(chǎn)工廠滥沫,然后客戶端調(diào)用對(duì)應(yīng)的工廠生產(chǎn)即可侣集。

/**
 * 產(chǎn)品接口
 */
public interface Product {
  void use();
}

/**
 * 工廠接口
 */
public interface Factory {
  Product createProduct();
}

/**
 * A產(chǎn)品
 */
public class ProductA implements Product {
  public void use() {
    System.out.println("use ProductA");
  }
}

/**
 * B產(chǎn)品
 */
public class ProductB implements Product {
  public void use() {
    System.out.println("use ProductB");
  }
}

/**
 * A產(chǎn)品工廠
 */
public class FactoryA implements Factory {
  public ProductA createProduct() {
    return new ProductA();
  }
}

/**
 * B產(chǎn)品工廠
 */
public class FactoryB implements Factory{
  public Product createProduct() {
    return new ProductB();
  }
}

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

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

工廠方法模式的實(shí)際應(yīng)用舉例

  • 日志記錄器
    某系統(tǒng)日志記錄器要求支持多種日志記錄方式,如文件記錄兰绣、數(shù)據(jù)庫(kù)記錄等世分,且用戶可以根據(jù)要求動(dòng)態(tài)選擇日志記錄方式, 現(xiàn)使用工廠方法模式設(shè)計(jì)該系統(tǒng)缀辩。
loger.jpg
  • JDBC中的工廠方法
Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://loc
alhost:1433; DatabaseName=DB;user=sa;password=");
Statement statement=conn.createStatement();
ResultSet rs=statement.executeQuery("select * from UserInfo");

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

  • 向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié)臭埋,用戶只需要關(guān)心所需產(chǎn)品對(duì)應(yīng)的工廠,無(wú)須關(guān)心創(chuàng)建細(xì)節(jié)臀玄,甚至無(wú)須知道具體產(chǎn)品類的類名瓢阴。降低了耦合度封裝了變化。
  • 增加新產(chǎn)品時(shí)健无,無(wú)須修改其他的具體工廠和具體產(chǎn)品荣恐,只需要增加具體產(chǎn)品以及具體生產(chǎn)工廠即可。符合“開(kāi)閉原則”睬涧。

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

  • 據(jù)說(shuō)是:每增加一個(gè)產(chǎn)品就需要編寫(xiě)相關(guān)的工廠類募胃,系統(tǒng)類的個(gè)數(shù)增加,增加系統(tǒng)復(fù)雜度畦浓,和編譯速度痹束。(本人不太同意這個(gè)觀點(diǎn)。讶请。祷嘶。)

抽象工廠模式

為了更清晰地理解工廠方法模式,需要先引入兩個(gè)概念:

  • 產(chǎn)品等級(jí)結(jié)構(gòu)
    產(chǎn)品等級(jí)結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu)夺溢,如一個(gè)抽象類是電視機(jī)论巍,其子類有海爾電視機(jī)、海信電視機(jī)风响、TCL電視機(jī)嘉汰,則抽象電視機(jī)與具體品牌的電視機(jī)之間構(gòu)成了一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),抽象電視機(jī)是父類状勤,而具體品牌的電視機(jī)是其子類鞋怀。
  • 產(chǎn)品族
    在抽象工廠模式中双泪,產(chǎn)品族是指由同一個(gè)工廠生產(chǎn)的,位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中的一組產(chǎn)品密似,如海爾電器工廠生產(chǎn)的海爾電視機(jī)焙矛、海爾電冰箱,海爾電視機(jī)位于電視機(jī)產(chǎn)品等級(jí)結(jié)構(gòu)中残腌,海爾電冰箱位于電冰箱產(chǎn)品等級(jí)結(jié)構(gòu)中村斟。

在工廠方法模式中,某一個(gè)具體工廠負(fù)責(zé)某一個(gè)具體的產(chǎn)品抛猫。但是現(xiàn)實(shí)中蟆盹,我們可能需要某一個(gè)工廠負(fù)責(zé)某生產(chǎn)一個(gè)產(chǎn)品族的產(chǎn)品。這時(shí)使用抽象工廠會(huì)比較合適闺金。這里我們使用UML圖來(lái)表示抽象抽象工廠模式

AbatractFactory.jpg

抽象工廠的實(shí)際使用

  • 情景模式的實(shí)現(xiàn)
    比如黑夜模式下日缨,需要對(duì)UI界面的多個(gè)元素就行修改,這時(shí)可以使用抽象共產(chǎn)模式

抽象工廠的優(yōu)點(diǎn)

  • 抽象工廠模式隔離了具體類的生成掖看,使得客戶并不需要知道什么被創(chuàng)建。
  • 當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí)面哥,它能夠保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象哎壳。這對(duì)一些需要根據(jù)當(dāng)前環(huán)境來(lái)決定其行為的軟件系統(tǒng)來(lái)說(shuō),是一種非常實(shí)用的設(shè)計(jì)模式尚卫。
  • 增加新的具體工廠和產(chǎn)品族很方便(但是增加新的產(chǎn)品等級(jí)結(jié)構(gòu)麻煩)

抽象工廠的缺點(diǎn)

  • 在添加新的產(chǎn)品對(duì)象時(shí)归榕,難以擴(kuò)展抽象工廠來(lái)生產(chǎn)新種類的產(chǎn)品,這是因?yàn)樵诔橄蠊S角色中規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合吱涉,要支持新種類的產(chǎn)品就意味著要對(duì)該接口進(jìn)行擴(kuò)展刹泄,而這將涉及到對(duì)抽象工廠角色及其所有子類的修改,顯然會(huì)帶來(lái)較大的不便怎爵。

  • 開(kāi)閉原則的傾斜性(增加新的工廠和產(chǎn)品族容易特石,增加新的產(chǎn)品等級(jí)結(jié)構(gòu)麻煩)。

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳖链,一起剝皮案震驚了整個(gè)濱河市姆蘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芙委,老刑警劉巖逞敷,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異灌侣,居然都是意外死亡推捐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)侧啼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牛柒,“玉大人堪簿,你說(shuō)我怎么就攤上這事⊙媛纾” “怎么了戴甩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)闪彼。 經(jīng)常有香客問(wèn)我甜孤,道長(zhǎng),這世上最難降的妖魔是什么畏腕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任缴川,我火速辦了婚禮,結(jié)果婚禮上描馅,老公的妹妹穿的比我還像新娘把夸。我一直安慰自己,他們只是感情好铭污,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布恋日。 她就那樣靜靜地躺著,像睡著了一般嘹狞。 火紅的嫁衣襯著肌膚如雪岂膳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天磅网,我揣著相機(jī)與錄音谈截,去河邊找鬼。 笑死涧偷,一個(gè)胖子當(dāng)著我的面吹牛簸喂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燎潮,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼喻鳄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了确封?” 一聲冷哼從身側(cè)響起诽表,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隅肥,沒(méi)想到半個(gè)月后竿奏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腥放,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年泛啸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秃症。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡候址,死狀恐怖吕粹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岗仑,我是刑警寧澤匹耕,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站荠雕,受9級(jí)特大地震影響稳其,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炸卑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一既鞠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盖文,春花似錦嘱蛋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至疙驾,卻和暖如春桐玻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荆萤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铣卡,地道東北人链韭。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像煮落,于是被迫代替她去往敵國(guó)和親敞峭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 工廠方法模式通過(guò)引入工廠等級(jí)結(jié)構(gòu)蝉仇,解決了簡(jiǎn)單工廠模式中工廠類職責(zé)太重的問(wèn)題旋讹,但由于工廠方法模式中的每個(gè)工廠只生產(chǎn)一...
    justCode_閱讀 1,196評(píng)論 1 6
  • 設(shè)計(jì)原則: 要依賴抽象,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是抽象工廠模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,113評(píng)論 0 6
  • 創(chuàng)建型模式 抽象工廠模式(abstract facroty) 3.1模式動(dòng)機(jī) 在工廠方法模式中具體工廠負(fù)責(zé)生產(chǎn)具體...
    僚機(jī)KK閱讀 737評(píng)論 0 2
  • 抽象工廠模式 介紹 工廠方法模式通過(guò)引入工廠等級(jí)結(jié)構(gòu)轿衔,解決了簡(jiǎn)單工廠模式中工廠類職責(zé)太重的問(wèn)題沉迹,但由于工廠方法模式...
    666真666閱讀 1,227評(píng)論 0 7
  • “她死了?”那雙帶著紅血絲的眼珠看著啞仆害驹,啞仆忽然不敢點(diǎn)頭了鞭呕,寒風(fēng)刺骨,疾風(fēng)向他襲來(lái)宛官,他汗毛直豎葫松,看吧瓦糕,這就要發(fā)瘋...
    元詡閱讀 536評(píng)論 0 2