C++设计模式中的工厂模式详细介绍

 更新时间:2022年09月01日 09:51:25   作者:愤怒的小黄鸭  
工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字,就可以通过工厂对象的相应工厂函数来制造你需要的对象

1. 简单工厂模式

简单工厂模式(Simple Factory Pattern): 是指定义一个工厂类,工厂类中实现一个方法,此方法根据不同的参数返回不同的类,UML类图如下所示:

代码如下:

#include <iostream>
using namespace std;
class Product
{
public:
	~Product() {}
	// 纯虚函数
	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");
}

简单工厂模式的问题:

  • 当要创建的实例过多时,会存在过多的if语句
  • 当要创建新的实例时要修改工厂方法,这样做违背了开-闭原则(即对扩展开放,对修改关闭的原则)

2. 工厂方法模式

工厂方法模式(Factory Method Pattern): 是在简单工厂模式的基础上将工厂类修改为抽象类,具体的类实例创建交给抽象工厂的子类。UML类图如所示:

代码如下所示:

#include <iostream>
using namespace std;
class Product
{
public:
	~Product() {}
	// 纯虚函数
	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");
}

工厂方法模式很好的避免了过多的if语句,同时也保证了开-闭原则,但是当类过多时会产生类"爆炸"的情况,所以具体选用什么模式需要根据实际需求进行取舍。

3. 抽象工厂模式

抽象工厂与工厂方法相比,抽象工厂允许生成不同的产品(即一个工厂存在多个产品)。代码如下所示:

```cpp
#include <iostream>
using namespace std;
class Product
{
public:
	~Product() {}
	// 纯虚函数
	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");
}

到此这篇关于C++设计模式中的工厂模式详细介绍的文章就介绍到这了,更多相关C++工厂模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++课程设计之学生成绩管理系统

    C++课程设计之学生成绩管理系统

    这篇文章主要为大家详细介绍了C++课程设计之学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++ STL 四种智能指针的用法详解

    C++ STL 四种智能指针的用法详解

    C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,今天给大家详细介绍这几种指针的具体用法,需要的朋友参考下吧
    2021-06-06
  • c++ Protobuf解决数据传输瓶颈面试精讲

    c++ Protobuf解决数据传输瓶颈面试精讲

    这篇文章主要介绍了c++ Protobuf解决数据传输瓶颈利器面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • QT连接Mysql数据库的实现步骤

    QT连接Mysql数据库的实现步骤

    本文主要介绍了QT连接Mysql数据库的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • c/c++语言位域注意事项分析

    c/c++语言位域注意事项分析

    所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,答应在程序中按域名进行操作
    2013-09-09
  • c++11 chrono全面解析(最高可达纳秒级别的精度)

    c++11 chrono全面解析(最高可达纳秒级别的精度)

    chrono是c++ 11中的时间库,本文就来详细的介绍一下chrono库的具体使用,关键是理解里面时间段(Durations)、时间点(Time points)的概念,感兴趣的可以了解一下
    2021-11-11
  • C语言浮点型数据在内存中的存储方式详解

    C语言浮点型数据在内存中的存储方式详解

    任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100,下面这篇文章主要给大家介绍了关于C语言浮点型数据在内存中的存储方式,需要的朋友可以参考下
    2023-03-03
  • C++ 基础编程之十进制转换为任意进制及操作符重载

    C++ 基础编程之十进制转换为任意进制及操作符重载

    这篇文章主要介绍了C++ 基础编程之十进制转换为任意进制及操作符重载的相关资料,需要的朋友可以参考下
    2017-02-02
  • C语言中字符型数据和浮点型数据介绍

    C语言中字符型数据和浮点型数据介绍

    大家好,本篇文章主要讲的是C语言中字符型数据和浮点型数据介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • 解析C++中的虚拟函数及其静态类型和动态类型

    解析C++中的虚拟函数及其静态类型和动态类型

    虚拟函数(Visual Function)亦常被成为虚函数,是C++中的一个重要特性,本文我们就来解析C++中的虚拟函数及其静态类型和动态类型
    2016-06-06

最新评论