本文最后更新于:2020年7月1日 晚上

* 除了单例模式和观察者监听者模式,本篇再介绍一下工厂模式。。。→_→ *

  1. 面向对象编程中出现的问题

    • 在面向对象编程中,可能会会由一种父类派生出许许多多的子类。而当我们在使用new实例化一个子类对象之前,也可能需要进行很多提前操作,比如调用其他的方法、获取相应的参数列表的值、在数据库中查询相关信息等

    • 当类型越来越多、名字越来越复杂的时候,每次去实例化一个子类对象时,都要进行很多提前操作,这就导致了出现了大量的可能产生问题的代码。使得可维护性下降,发生错误的时候查询错误、更正错误就会变得非常困难

  2. 工厂模式的作用

    • 工厂模式的应用实现了代码的高内聚低耦合,其中定义了创建子类对象的接口,封装了子类对象的创建过程,这样我们就不用每次都辛苦的写一堆实例化子类对象的提前操作

    • 工厂模式的应用也使实例化子类对象的操作延迟到了子类中,因为只有在子类中可以决定到底实例化哪一个类

  3. 工厂模式结构示意图

    • 工厂模式
  4. 代码实现

#include <iostream>
#include <vld.h>
using namespace std;

//产品父类
class Product
{
public:
	virtual ~Product() = 0;
protected:
	Product() {};
};
Product::~Product() {}

//产品子类A
class ConcreteProductA : public Product
{ 
public:
	~ConcreteProductA() {}
	ConcreteProductA() 
	{ 
		cout << "ConcreteProductA..." << endl; 
	}
};

//产品子类B
class ConcreteProductB : public Product
{
public:
	~ConcreteProductB() {}
	ConcreteProductB()
	{
		cout << "ConcreteProductB..." << endl;
	}
};

//产品子类C
class ConcreteProductC : public Product
{
public:
	~ConcreteProductC() {}
	ConcreteProductC()
	{
		cout << "ConcreteProductC..." << endl;
	}
};

//工厂父类
class Factory
{
public:
	virtual ~Factory() = 0;
	//工厂父类中提供实例化不同产品子类的调用接口,即纯虚函数
	//在工厂子类中重写调用接口,多个调用接口的重载以实现实例化不同的产品子类
	//这样就将实例化产品子类对象的操作延迟到了工厂子类中
	virtual Product* CreateProduct(int num) = 0;
protected:
	Factory() {}
};
Factory::~Factory() {}

//工厂子类
class ConcreteFactory : public Factory
{
public:
	~ConcreteFactory() {}
	ConcreteFactory()
	{ 
		cout << "ConcreteFactory..." << endl; 
	}
	//工厂子类中提供了实例化产品子类的调用接口
	//很好地将提前操作封装起来,实现代码的高内聚低耦合,提高了代码的可维护性和可扩展性
	//可以通过参数switch不同的产品子类的实例化调用接口
	Product* CreateProduct(int num)
	{
		switch (num)
		{
		case 0:
			return new ConcreteProductA();
			break;
		case 1:
			return new ConcreteProductB();
			break;
		case 2:
			return new ConcreteProductC();
			break;
		default:
			break;
		}
	}
};

int main()
{
	Factory* fac = new ConcreteFactory();//创建工厂子类
	//利用工厂子类提供的调用接口实例化某一种产品对象
	Product* pA = fac->CreateProduct(0);
	Product* pB = fac->CreateProduct(1);
	Product* pC = fac->CreateProduct(2);
	
	delete pA;
	delete pB;
	delete pC;
	delete fac;
	return 0;
}

运行结果

工厂模式运行结果

* 码完。。。收工。。。→_→ *