C++ 簡單工廠模式 - BBA 造車了

簡單工廠模式(Simple Factory Pattern)又叫做靜態(tài)工廠方法模式(Static Factory Method Pattern),屬于創(chuàng)建型模式。簡單工廠模式的實質(zhì)是由一個工廠類根據(jù)傳入的參數(shù),動態(tài)決定應(yīng)該創(chuàng)建哪一個產(chǎn)品類的實例。
值得注意的是,簡單工廠模式并不屬于 23 種 GoF 設(shè)計模式之一。它是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現(xiàn)。
1
模式結(jié)構(gòu)
UML 結(jié)構(gòu)圖:

工廠(Factory):整個模式的核心,負責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯。
抽象產(chǎn)品(Product):所有具體產(chǎn)品的父類,負責(zé)描述所有實例所共有的公共接口。
具體產(chǎn)品(ConcreteProduct):最終創(chuàng)建的具體產(chǎn)品
2
優(yōu)缺點
工廠類包含了必要的邏輯判斷,根據(jù)指定的信息來創(chuàng)建對應(yīng)的產(chǎn)品??蛻舳藘H負責(zé)“消費”產(chǎn)品即可,實現(xiàn)了對象創(chuàng)建和使用的分離。
客戶端無需關(guān)心具體產(chǎn)品如何創(chuàng)建與組織,僅需知道具體產(chǎn)品所對應(yīng)的參數(shù)即可,可以在一定程度減少使用者的記憶量。
由于工廠類集中了所有產(chǎn)品的創(chuàng)建邏輯(違反了高內(nèi)聚責(zé)任分配原則),職責(zé)過重,一旦無法正常工作,整個系統(tǒng)都將受到影響。
一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時,有可能造成工廠邏輯過于復(fù)雜,不利于系統(tǒng)的擴展和維護。
這些缺點在"工廠方法模式"中得到了一定的克服。
3
適用場景
工廠類負責(zé)創(chuàng)建的對象比較少(不會造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜)。
客戶端僅需知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象(邏輯)不關(guān)心。
注意:由于簡單工廠很容易違反高內(nèi)聚責(zé)任分配原則,因此一般只在很簡單的情況下應(yīng)用。
4
案例分析
BBA - 奔馳、寶馬、奧迪

互聯(lián)網(wǎng)行業(yè)有三巨頭 BAT,汽車界也有三大豪門 BBA。它們是馳名世界的汽車企業(yè),也被認為是高檔汽車生產(chǎn)的先導(dǎo),最可怕的是均屬于德國制造。奔馳優(yōu)雅穩(wěn)重、寶馬操控感強、奧迪大氣,更是官車的代表。。。“坐奔馳,開寶馬”,足以說明一切。
在國內(nèi),BBA 大受歡迎,對很多人來說,不僅是代步工具,更是身份的象征。但車再好,也需要在工廠中加工生產(chǎn),來一起看看簡單工廠模式吧!
5
代碼實現(xiàn)
汽車產(chǎn)品,由 ICar 表示:
// product.h
#ifndef PRODUCT_H
#define PRODUCT_H
#include <string>
using namespace std;
// 汽車接口
class ICar
{
public:
virtual string Name() = 0; // 汽車名稱
};
#endif // PRODUCT_H
模型有了,就可以定義具體的汽車了,它們有不同的品牌:
// concrete_product.h
#ifndef CONCRETE_PRODUCT_H
#define CONCRETE_PRODUCT_H
#include "product.h"
// 奔馳汽車
class BenzCar : public ICar
{
public:
string Name() override {
return "Benz Car";
}
};
// 寶馬汽車
class BmwCar : public ICar
{
public:
string Name() override {
return "Bmw Car";
}
};
// 奧迪汽車
class AudiCar : public ICar
{
public:
string Name() override {
return "Audi Car";
}
};
#endif // CONCRETE_PRODUCT_H
要生產(chǎn)汽車,需要有相應(yīng)的工廠:
// factory.h
#ifndef FACTORY_H
#define FACTORY_H
#include "concrete_product.h"
enum class CAR_TYPE {
BENZ, // 奔馳汽車
BMW, // 寶馬汽車
AUDI // 奧迪汽車
};
// 工廠
class Factory
{
public:
// 生產(chǎn)汽車
ICar* CreateCar(CAR_TYPE type) {
ICar *pCar = nullptr;
switch(type) {
case CAR_TYPE::BENZ:
pCar = new BenzCar(); // 奔馳汽車
break;
case CAR_TYPE::BMW:
pCar = new BmwCar(); // 寶馬汽車
break;
case CAR_TYPE::AUDI:
pCar = new AudiCar(); // 奧迪汽車
break;
default:
break;
}
return pCar;
}
};
#endif // FACTORY_H
這樣以來,工廠就可以根據(jù)汽車類型來生產(chǎn)對應(yīng)的汽車了。
當(dāng)一切準備就緒,就可以實現(xiàn)客戶端了:
// main.cpp
#include "factory.h"
#include "product.h"
#include <iostream>
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=nullptr;} }
#endif
int main()
{
// 工廠
Factory *pFactory = new Factory();
// 生產(chǎn)奔馳、寶馬、奧迪
ICar *pBenzCar = pFactory->CreateCar(CAR_TYPE::BENZ);
ICar* pBmwCar = pFactory->CreateCar(CAR_TYPE::BMW);
ICar* pAudiCar = pFactory->CreateCar(CAR_TYPE::AUDI);
cout << pBenzCar->Name() << endl;
cout << pBmwCar->Name() << endl;
cout << pAudiCar->Name() << endl;
SAFE_DELETE(pBenzCar);
SAFE_DELETE(pBmwCar);
SAFE_DELETE(pAudiCar);
SAFE_DELETE(pFactory);
getchar();
return 0;
}
輸出如下:
Benz Car
Bmw Car
Audi Car
·················· END ··················
關(guān)注后回復(fù)「1024」,獲取海量學(xué)習(xí)資源

