簡單工廠馁筐、工廠模式、抽象工廠模式

簡單工廠

1.模式定義

簡單工廠模式(Simple Factory Pattern):又稱為靜態(tài)工廠方法(Static Factory Method)模式坠非,它屬于類創(chuàng)建型模式敏沉。在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實例炎码。

2.模式結(jié)構(gòu)

Factory:工廠角色
工廠角色負責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯
Product:抽象產(chǎn)品角色
抽象產(chǎn)品角色是所創(chuàng)建的所有對象的父類盟迟,負責(zé)描述所有實例所共有的公共接口
ConcreteProduct:具體產(chǎn)品角色
具體產(chǎn)品角色是創(chuàng)建目標,所有創(chuàng)建的對象都充當這個角色的某個具體類的實例潦闲。


image.png
Product *Factory::createProduct(string proname) {
    if ("A" == proname) {
        return new ConcreteProductA();
    } else if ("B" == proname) {
        return new ConcreteProductB();
    }
    return NULL;
}

3.優(yōu)缺點

  • 優(yōu)點
  1. 工廠類含有必要的判斷邏輯攒菠,可以決定在什么時候創(chuàng)建哪一個產(chǎn)品類的實例,客戶端可以免除直接創(chuàng)建產(chǎn)品對象的責(zé)任歉闰,而僅僅“消費”產(chǎn)品辖众。
  2. 客戶端無須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對應(yīng)的參數(shù)即可和敬。
  3. 通過引入配置文件凹炸,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,在一定程度上提高了系統(tǒng)的靈活性昼弟。
  • 缺點
  1. 工廠類集中了所有產(chǎn)品創(chuàng)建邏輯啤它,一旦不能正常工作,整個系統(tǒng)都要受到影響。
  2. 簡單工廠模式將會增加系統(tǒng)中類的個數(shù)变骡,在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度离赫。
  3. 系統(tǒng)擴展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯锣光,在產(chǎn)品類型較多時笆怠,有可能造成工廠邏輯過于復(fù)雜,不利于系統(tǒng)的擴展和維護誊爹。

4.適用場景

  • 工廠類負責(zé)創(chuàng)建的對象比較少:由于創(chuàng)建的對象較少蹬刷,不會造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜。
  • 客戶端只知道傳入工廠類的參數(shù)频丘,對于如何創(chuàng)建對象不關(guān)心:客戶端既不需要關(guān)心創(chuàng)建細節(jié)办成,甚至連類名都不需要記住,只需要知道類型所對應(yīng)的參數(shù)搂漠。

工廠模式

1.模式定義

工廠方法模式(Factory Method Pattern)又稱為工廠模式迂卢,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式,它屬于類創(chuàng)建型模式桐汤。在工廠方法模式中而克,工廠父類負責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負責(zé)生成具體的產(chǎn)品對象怔毛,這樣做的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完成员萍,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類。

2.模式結(jié)構(gòu)

Product:抽象產(chǎn)品
ConcreteProduct:具體產(chǎn)品
Factory:抽象工廠
ConcreteFactory:具體工廠


image.png
Product* ConcreteFactory::factoryMethod(){
    return  new ConcreteProduct();
}

int main(int argc, char *argv[])
{
    Factory * fc = new ConcreteFactory();
    Product * prod = fc->factoryMethod();
    prod->use();
    return 0;
}

3.模式分析

工廠方法模式是簡單工廠模式的進一步抽象和推廣拣度。由于使用了面向?qū)ο蟮亩鄳B(tài)性碎绎,工廠方法模式保持了簡單工廠模式的優(yōu)點,而且克服了它的缺點抗果。在工廠方法模式中筋帖,核心的工廠類不再負責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做冤馏。這個核心類僅僅負責(zé)給出具體工廠必須實現(xiàn)的接口日麸,而不負責(zé)哪一個產(chǎn)品類被實例化這種細節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進新產(chǎn)品宿接。

4.實例

  • 結(jié)構(gòu)圖:


    image.png
  • 時序圖:


    image.png

5.工廠模式的優(yōu)缺點

優(yōu)點:

  • 在工廠方法模式中赘淮,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時還向客戶隱藏了哪種具體產(chǎn)品類將被實例化這一細節(jié)睦霎,用戶只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細節(jié)走诞,甚至無須知道具體產(chǎn)品類的類名副女。
  • 一個類通過其子類來指定創(chuàng)建哪個對象:在工廠方法模式中,對于抽象工廠類只需要提供一個創(chuàng)建產(chǎn)品的接口蚣旱,而由其子類來確定具體要創(chuàng)建的對象碑幅,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則戴陡,在程序運行時,子類對象將覆蓋父類對象沟涨,從而使得系統(tǒng)更容易擴展恤批。
  • 將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類裹赴,需要時再動態(tài)指定喜庞,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。

缺點:

  • 在添加新產(chǎn)品時棋返,需要編寫新的具體產(chǎn)品類延都,而且還要提供與之對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加睛竣,在一定程度上增加了系統(tǒng)的復(fù)雜度晰房,有更多的類需要編譯和運行,會給系統(tǒng)帶來一些額外的開銷射沟。
  • 由于考慮到系統(tǒng)的可擴展性殊者,需要引入抽象層,在客戶端代碼中均使用抽象層進行定義验夯,增加了系統(tǒng)的抽象性和理解難度猖吴,且在實現(xiàn)時可能需要用到DOM、反射等技術(shù)簿姨,增加了系統(tǒng)的實現(xiàn)難度距误。

6.適用場景

  • 一個類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類的類名扁位,只需要知道所對應(yīng)的工廠即可准潭,具體的產(chǎn)品對象由具體工廠類創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類域仇。
  • 一個類通過其子類來指定創(chuàng)建哪個對象:在工廠方法模式中刑然,對于抽象工廠類只需要提供一個創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要創(chuàng)建的對象暇务,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則泼掠,在程序運行時,子類對象將覆蓋父類對象垦细,從而使得系統(tǒng)更容易擴展择镇。
  • 將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類括改,需要時再動態(tài)指定腻豌,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。

7.模式應(yīng)用

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");

8.參考文章

http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html

抽象工廠模式

1.模式定義

抽象工廠模式(Abstract Factory Pattern):提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類吝梅。抽象工廠模式又稱為Kit模式虱疏,屬于對象創(chuàng)建型模式。

2.模式結(jié)構(gòu)

抽象工廠模式包含如下角色:

  • AbstractFactory:抽象工廠
  • ConcreteFactory:具體工廠
  • AbstractProduct:抽象產(chǎn)品
  • Product:具體產(chǎn)品


    image.png

3.代碼分析

  • image.png
int main(int argc, char *argv[])
{
    AbstractFactory * fc = new ConcreteFactory1();
    AbstractProductA * pa =  fc->createProductA();
    AbstractProductB * pb = fc->createProductB();
    pa->use();
    pb->eat();
    
    AbstractFactory * fc2 = new ConcreteFactory2();
    AbstractProductA * pa2 =  fc2->createProductA();
    AbstractProductB * pb2 = fc2->createProductB();
    pa2->use();
    pb2->eat();
}
#include "ConcreteFactory1.h"
#include "ProductA1.h"
#include "ProductB1.h"
AbstractProductA * ConcreteFactory1::createProductA(){
    return new ProductA1();
}
AbstractProductB * ConcreteFactory1::createProductB(){
    return new ProductB1();
}
#include "ProductA1.h"
#include <iostream>
using namespace std;
void ProductA1::use(){
    cout << "use Product A1" << endl;
}

4.優(yōu)缺點

優(yōu)點

  • 抽象工廠模式隔離了具體類的生成苏携,使得客戶并不需要知道什么被創(chuàng)建做瞪。由于這種隔離,更換一個具體工廠就變得相對容易右冻。所有的具體工廠都實現(xiàn)了抽象工廠中定義的那些公共接口装蓬,因此只需改變具體工廠的實例,就可以在某種程度上改變整個軟件系統(tǒng)的行為国旷。另外矛物,應(yīng)用抽象工廠模式可以實現(xiàn)高內(nèi)聚低耦合的設(shè)計目的,因此抽象工廠模式得到了廣泛的應(yīng)用跪但。
  • 當一個產(chǎn)品族中的多個對象被設(shè)計成一起工作時履羞,它能夠保證客戶端始終只使用同一個產(chǎn)品族中的對象。這對一些需要根據(jù)當前環(huán)境來決定其行為的軟件系統(tǒng)來說屡久,是一種非常實用的設(shè)計模式忆首。
  • 增加新的具體工廠和產(chǎn)品族很方便,無須修改已有系統(tǒng)被环,符合“開閉原則”糙及。

缺點

  • 在添加新的產(chǎn)品對象時,難以擴展抽象工廠來生產(chǎn)新種類的產(chǎn)品筛欢,這是因為在抽象工廠角色中規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合浸锨,要支持新種類的產(chǎn)品就意味著要對該接口進行擴展,而這將涉及到對抽象工廠角色及其所有子類的修改版姑,顯然會帶來較大的不便柱搜。
  • 開閉原則的傾斜性(增加新的工廠和產(chǎn)品族容易,增加新的產(chǎn)品等級結(jié)構(gòu)麻煩)剥险。

5.適用場景

在以下情況下可以使用抽象工廠模式:

  • 一個系統(tǒng)不應(yīng)當依賴于產(chǎn)品類實例如何被創(chuàng)建聪蘸、組合和表達的細節(jié),這對于所有類型的工廠模式都是重要的表制。
  • 系統(tǒng)中有多于一個的產(chǎn)品族健爬,而每次只使用其中某一產(chǎn)品族。
  • 屬于同一個產(chǎn)品族的產(chǎn)品將在一起使用么介,這一約束必須在系統(tǒng)的設(shè)計中體現(xiàn)出來娜遵。
  • 系統(tǒng)提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn)壤短,從而使客戶端不依賴于具體實現(xiàn)魔熏。

6.參考文章

http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衷咽,一起剝皮案震驚了整個濱河市鸽扁,隨后出現(xiàn)的幾起案子蒜绽,更是在濱河造成了極大的恐慌,老刑警劉巖桶现,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躲雅,死亡現(xiàn)場離奇詭異,居然都是意外死亡骡和,警方通過查閱死者的電腦和手機相赁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慰于,“玉大人钮科,你說我怎么就攤上這事∑旁” “怎么了绵脯?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長休里。 經(jīng)常有香客問我蛆挫,道長,這世上最難降的妖魔是什么妙黍? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任悴侵,我火速辦了婚禮,結(jié)果婚禮上拭嫁,老公的妹妹穿的比我還像新娘可免。我一直安慰自己,他們只是感情好做粤,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布浇借。 她就那樣靜靜地躺著,像睡著了一般驮宴。 火紅的嫁衣襯著肌膚如雪逮刨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天堵泽,我揣著相機與錄音修己,去河邊找鬼。 笑死迎罗,一個胖子當著我的面吹牛睬愤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纹安,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼尤辱,長吁一口氣:“原來是場噩夢啊……” “哼砂豌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起光督,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤阳距,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后结借,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筐摘,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年船老,在試婚紗的時候發(fā)現(xiàn)自己被綠了咖熟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡柳畔,死狀恐怖馍管,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情薪韩,我是刑警寧澤确沸,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站躬存,受9級特大地震影響张惹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岭洲,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一宛逗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盾剩,春花似錦雷激、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驻粟,卻和暖如春茂嗓,著一層夾襖步出監(jiān)牢的瞬間抄腔,已是汗流浹背棉胀。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工徽鼎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酷麦。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓矿卑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沃饶。 傳聞我的和親對象是個殘疾皇子母廷,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348