《大話設(shè)計模式》復(fù)習總結(jié) -- 簡單工廠模式

1 概念

工廠模式的定義:定義一個創(chuàng)建產(chǎn)品對象的工廠接口匹表,將產(chǎn)品對象的實際創(chuàng)建工作推遲到具體子工廠類當中秃诵。這滿足創(chuàng)建型模式中所要求的“創(chuàng)建與使用相分離”的特點。

按實際業(yè)務(wù)場景劃分个榕,工廠模式有 3 種不同的實現(xiàn)方式忠烛,分別是簡單工廠模式、工廠方法模式和抽象工廠模式寂汇。

我們把被創(chuàng)建的對象稱為“產(chǎn)品”病往,把創(chuàng)建產(chǎn)品的對象稱為“工廠”。如果要創(chuàng)建的產(chǎn)品不多骄瓣,只要一個工廠類就可以完成停巷,這種模式叫“簡單工廠模式”。

在簡單工廠模式中創(chuàng)建實例的方法通常為靜態(tài)(static)方法榕栏,因此簡單工廠模式(Simple Factory Pattern)又叫作靜態(tài)工廠方法模式(Static Factory Method Pattern)畔勤。

簡單來說,簡單工廠模式有一個具體的工廠類扒磁,可以生成多個不同的產(chǎn)品庆揪,屬于創(chuàng)建型設(shè)計模式。簡單工廠模式不在 GoF 23 種設(shè)計模式之列渗磅。

2 UML圖

圖1 簡單工廠模式的UML圖

3 C++示例代碼

simple_factory.h

#include <iostream>

class Product {
public:
? ? virtual double GetResult(double a, double b) = 0;
};

class ProductA: public Product {
public:
? ? double GetResult(double a, double b) override;
};

class ProductB: public Product {
public:
? ? double GetResult(double a, double b) override;
};

class ProductC: public Product {
public:
? ? double GetResult(double a, double b) override;
};

class ProductD: public Product {
public:
? ? double GetResult(double a, double b) override;
};

class Factory {
public:
? ? static Product* GetProduct(int type); // 此處雖然不是強制用static嚷硫,但是用static更合理,這不需要解釋吧
};

simple_factory.cpp

#include <iostream>
#include "simple_factory.h"

using namespace std;

double ProductA::GetResult(double a, double b)
{
? ? return a + b;
}

double ProductB::GetResult(double a, double b)
{
? ? return a - b;
}

double ProductC::GetResult(double a, double b)
{
? ? return a * b;
}

double ProductD::GetResult(double a, double b)
{
? ? return a / b;
}

Product* Factory::GetProduct(int type)
{
? ? switch (type) {
? ? ? ? case 0:
? ? ? ? ? ? return new ProductA;
? ? ? ? case 1:
? ? ? ? ? ? return new ProductB;
? ? ? ? case 2:
? ? ? ? ? ? return new ProductC;
? ? ? ? case 3:
? ? ? ? ? ? return new ProductD;
? ? }
? ? return nullptr;
}

int main()
{
? ? Product *product = Factory::GetProduct(0);
? ? if (product == nullptr) {
? ? ? ? cout << "Get product failed" << endl;
? ? ? ? return -1;
? ? }

? ? double a = 0.1;
? ? double b = 0.2;
? ? double c = product->GetResult(a, b);

? ? cout << c << endl;
? ? return 0;
}

4 總結(jié)

簡單工廠模式每增加一個產(chǎn)品就要增加一個具體產(chǎn)品類和一個對應(yīng)的具體工廠類始鱼,這增加了系統(tǒng)的復(fù)雜度仔掸,違背了“開閉原則”。

優(yōu)點和缺點

優(yōu)點:

工廠類包含必要的邏輯判斷医清,可以決定在什么時候創(chuàng)建哪一個產(chǎn)品的實例起暮。客戶端可以免除直接創(chuàng)建產(chǎn)品對象的職責会烙,很方便的創(chuàng)建出相應(yīng)的產(chǎn)品负懦。工廠和產(chǎn)品的職責區(qū)分明確。

客戶端無需知道所創(chuàng)建具體產(chǎn)品的類名柏腻,只需知道參數(shù)即可纸厉。

也可以引入配置文件,在不修改客戶端代碼的情況下更換和添加新的具體產(chǎn)品類五嫂。

缺點:

簡單工廠模式的工廠類單一颗品,負責所有產(chǎn)品的創(chuàng)建肯尺,職責過重,一旦異常躯枢,整個系統(tǒng)將受影響则吟。且工廠類代碼會非常臃腫,違背高聚合原則锄蹂。

使用簡單工廠模式會增加系統(tǒng)中類的個數(shù)(引入新的工廠類)氓仲,增加系統(tǒng)的復(fù)雜度和理解難度

系統(tǒng)擴展困難,一旦增加新產(chǎn)品不得不修改工廠邏輯得糜,在產(chǎn)品類型較多時敬扛,可能造成邏輯過于復(fù)雜

簡單工廠模式使用了 static 工廠方法,造成工廠角色無法形成基于繼承的等級結(jié)構(gòu)掀亩。

應(yīng)用場景

對于產(chǎn)品種類相對較少的情況舔哪,考慮使用簡單工廠模式欢顷。使用簡單工廠模式的客戶端只需要傳入工廠類的參數(shù)槽棍,不需要關(guān)心如何創(chuàng)建對象的邏輯,可以很方便地創(chuàng)建所需產(chǎn)品抬驴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炼七,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子布持,更是在濱河造成了極大的恐慌豌拙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件题暖,死亡現(xiàn)場離奇詭異按傅,居然都是意外死亡,警方通過查閱死者的電腦和手機胧卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門唯绍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枝誊,你說我怎么就攤上這事况芒。” “怎么了叶撒?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵绝骚,是天一觀的道長。 經(jīng)常有香客問我祠够,道長压汪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任古瓤,我火速辦了婚禮止剖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己滴须,他們只是感情好舌狗,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扔水,像睡著了一般痛侍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魔市,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天主届,我揣著相機與錄音,去河邊找鬼待德。 笑死君丁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的将宪。 我是一名探鬼主播绘闷,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼较坛!你這毒婦竟也來了印蔗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丑勤,失蹤者是張志新(化名)和其女友劉穎华嘹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體法竞,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡耙厚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岔霸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薛躬。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖秉剑,靈堂內(nèi)的尸體忽然破棺而出泛豪,到底是詐尸還是另有隱情,我是刑警寧澤侦鹏,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布诡曙,位于F島的核電站,受9級特大地震影響略水,放射性物質(zhì)發(fā)生泄漏价卤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一渊涝、第九天 我趴在偏房一處隱蔽的房頂上張望慎璧。 院中可真熱鬧床嫌,春花似錦、人聲如沸胸私。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岁疼。三九已至阔涉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捷绒,已是汗流浹背瑰排。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暖侨,地道東北人椭住。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像字逗,于是被迫代替她去往敵國和親京郑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

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

  • 簡單工廠模式是屬于創(chuàng)建型模式扳肛,又叫做靜態(tài)工廠方法(Static Factory Method)模式傻挂,但不屬于23種...
    Ritchie_Li閱讀 137評論 0 5
  • 簡單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(StaticFactoryMethod)模式挖息,但不屬于23種GO...
    RedMushrooms閱讀 295評論 0 1
  • 簡介:工廠模式大體分為 簡單工廠,工廠方法兽肤,抽象工廠等三種模式套腹。工廠方法模式也可以稱為工廠模式。簡單工廠進階變成工...
    Gxy_8c77閱讀 146評論 0 0
  • 簡單工廠模式基本實現(xiàn)流程 具體產(chǎn)品類:將需要創(chuàng)建的各種不同產(chǎn)品對象的相關(guān)代碼封裝到具體產(chǎn)品類中 抽象產(chǎn)品類:將具體...
    沉麟閱讀 795評論 0 0
  • 目的:通過工廠來產(chǎn)生對象资铡。 使用場景:當需要創(chuàng)建很多對象电禀,這樣如果需要修改對象,我們就可以直接修改這個工廠類;或者...
    哈哈_6855閱讀 271評論 0 0