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

1 概念

工廠模式的定義:定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將產(chǎn)品對象的實際創(chuàng)建工作推遲到具體子工廠類當(dā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)品對象的職責(zé),很方便的創(chuàng)建出相應(yīng)的產(chǎn)品。工廠和產(chǎn)品的職責(zé)區(qū)分明確。

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

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

缺點:

簡單工廠模式的工廠類單一,負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,職責(zé)過重,一旦異常,整個系統(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容