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圖
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)品抬驴。