日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C++設(shè)計(jì)模式中的工廠模式詳細(xì)介紹_C 語(yǔ)言

作者:憤怒的小黃鴨 ? 更新時(shí)間: 2022-10-27 編程語(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

欄目分類
最近更新