網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1. 簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式(Simple Factory Pattern): 是指定義一個(gè)工廠類,工廠類中實(shí)現(xiàn)一個(gè)方法,此方法根據(jù)不同的參數(shù)返回不同的類,UML類圖如下所示:
代碼如下:
#include <iostream>
using namespace std;
class Product
{
public:
~Product() {}
// 純虛函數(shù)
virtual void Create(string content) = 0;
};
class ProductA : public Product
{
public:
void Create(string content) override {
cout << "ProductA " << content << endl;
}
};
class ProductB : public Product
{
public:
void Create(string content) override {
cout << "ProductB " << content << endl;
}
};
class Factory
{
public:
Product* CreateProduct(const type_info& ty_info) {
if (ty_info == typeid(ProductA))
{
return m_pProductA = new ProductA();
}
else if (ty_info == typeid(ProductB))
{
return m_pProductB = new ProductB();
}
return NULL;
}
~Factory(){
if(m_pProductA)
delete m_pProductA;
if(m_pProductB)
delete m_pProductB;
}
private:
ProductA* m_pProductA;
ProductB* m_pProductB;
};
int main()
{
Factory factory;
factory.CreateProduct(typeid(ProductA))->Create("A");
factory.CreateProduct(typeid(ProductB))->Create("B");
system("pause");
}
簡(jiǎn)單工廠模式的問(wèn)題:
- 當(dāng)要?jiǎng)?chuàng)建的實(shí)例過(guò)多時(shí),會(huì)存在過(guò)多的if語(yǔ)句
- 當(dāng)要?jiǎng)?chuàng)建新的實(shí)例時(shí)要修改工廠方法,這樣做違背了開(kāi)-閉原則(即對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉的原則)
2. 工廠方法模式
工廠方法模式(Factory Method Pattern): 是在簡(jiǎn)單工廠模式的基礎(chǔ)上將工廠類修改為抽象類,具體的類實(shí)例創(chuàng)建交給抽象工廠的子類。UML類圖如所示:
代碼如下所示:
#include <iostream>
using namespace std;
class Product
{
public:
~Product() {}
// 純虛函數(shù)
virtual void Create(string content) = 0;
};
class ProductA : public Product
{
public:
void Create(string content) override {
cout << "ProductA " << content << endl;
}
};
class ProductB : public Product
{
public:
void Create(string content) override {
cout << "ProductB " << content << endl;
}
};
class Factory
{
public:
virtual Product* CreateProduct() = 0;
Product* m_pProduct;
virtual ~Factory() {
if (m_pProduct)
delete m_pProduct;
}
};
class FactoryA : public Factory
{
public:
virtual Product* CreateProduct() override{
return m_pProduct = new ProductA();
}
};
class FactoryB : public Factory
{
public:
virtual Product* CreateProduct() override {
return m_pProduct = new ProductB();
}
};
int main()
{
FactoryA factroyA;
FactoryB factroyB;
factroyA.CreateProduct()->Create("A");
factroyB.CreateProduct()->Create("B");
system("pause");
}
工廠方法模式很好的避免了過(guò)多的if語(yǔ)句,同時(shí)也保證了開(kāi)-閉原則,但是當(dāng)類過(guò)多時(shí)會(huì)產(chǎn)生類"爆炸"的情況,所以具體選用什么模式需要根據(jù)實(shí)際需求進(jìn)行取舍。
3. 抽象工廠模式
抽象工廠與工廠方法相比,抽象工廠允許生成不同的產(chǎn)品(即一個(gè)工廠存在多個(gè)產(chǎn)品)。代碼如下所示:
```cpp
#include <iostream>
using namespace std;
class Product
{
public:
~Product() {}
// 純虛函數(shù)
virtual void Create(string content) = 0;
};
class ProductA : public Product
{
public:
void Create(string content) override {
cout << "ProductA " << content << endl;
}
};
class ProductB : public Product
{
public:
void Create(string content) override {
cout << "ProductB " << content << endl;
}
};
class Factory
{
public:
virtual Product* CreateProductA() = 0;
virtual Product* CreateProductB() = 0;
Product* m_pProductA;
Product* m_pProductB;
virtual ~Factory() {
if (m_pProductA)
delete m_pProduct;
if(m_pProductB)
delete m_pProductB;
}
};
class FactorySubOne : public Factory
{
public:
virtual Product* CreateProductA() override{
return m_pProductA = new ProductA();
}
virtual Product* CreateProductB() override {
return m_pProductB = new ProductB();
}
};
class FactorySubTwo : public Factory
{
public:
virtual Product* CreateProductA() override{
return m_pProductA = new ProductA();
}
virtual Product* CreateProductB() override {
return m_pProductB = new ProductB();
}
};
int main()
{
FactorySubOne factroy_sub_one;
FactorySubTwo factroy_sub_two;
factroy_sub_one.CreateProductA()->Create("FactorySubOne A");
factroy_sub_one.CreateProductB()->Create("FactorySubOne B");
factroy_sub_two.CreateProductA()->Create("FactorySubTwo A");
factroy_sub_two.CreateProductB()->Create("FactorySubTwo B");
system("pause");
}
原文鏈接:https://blog.csdn.net/weixin_41111116/article/details/120399588
相關(guān)推薦
- 2022-09-06 python實(shí)現(xiàn)plt?x軸坐標(biāo)按1刻度顯示_python
- 2022-11-05 Kotlin方法與Lambda表達(dá)式實(shí)踐使用介紹_Android
- 2022-12-13 Redis?Hash序列化存儲(chǔ)的問(wèn)題及解決方案_Redis
- 2022-01-30 uniapp蘋(píng)果底部欄自適應(yīng)配置
- 2022-06-28 深入解析docker文件分層原理_docker
- 2022-06-16 C語(yǔ)言深入分析函數(shù)與宏的使用_C 語(yǔ)言
- 2022-07-30 golang?redis中Pipeline通道的使用詳解_Golang
- 2023-05-23 pytorch中backward()方法如何自動(dòng)求梯度_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支