大话设计模式C++版——简单工厂模式

简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器。


1、抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程)

class IOperation
{
public:
	IOperation() : m_nNuml(0), m_nNumr(0) {}
	virtual	~IOperation() {}
	
	virtual	void	SetNum(int nNuml = 0, int nNumr = 0)
	{
		m_nNuml = nNuml;
		m_nNumr = nNumr;
	}
	virtual	int		CalculateResult() = 0;
	
protected:
	int	m_nNuml, m_nNumr;
};

注:m_nNuml, m_nNumr申明为protected,是为了让继承类中能够使用,同时又保持其访问的私有性,这和C#是不一样的地方


2、接口实现对象类——加法、减法类(乘除法就省略了,类似)

class COperation_Add : public IOperation
{
public:
	int		CalculateResult()
	{
		return	m_nNuml + m_nNumr;
	}
};


class COperation_Dec : public IOperation
{
public:
	int		CalculateResult()
	{
		return	m_nNuml - m_nNumr;
	}
};


3、工厂类——生成抽象对象

<span style="font-size:14px;">class CClassFactory
{
public:
	CClassFactory() {}
	~CClassFactory() {}
	
	IOperation*	CreateObject(char cOperation)
	{
		IOperation*	poCOperation = NULL;
		switch (cOperation)
		{
		case '+':
			{
				poCOperation = new COperation_Add();
				break;
			}
		case '-':
			{
				poCOperation = new	COperation_Dec();
				break;
			}
			break;
		}
		
		return	poCOperation;
	}
};


4、使用工厂生产对象

void	Test()
{
	CClassFactory	oCClassFactory;
	IOperation*		poIOperation = NULL;

	poIOperation = oCClassFactory.CreateObject('+');
	
	if (poIOperation)
	{
		poIOperation->SetNum(2, 3);
		printf("2 + 3 = %d
", poIOperation->CalculateResult());
		
		delete poIOperation;
	}
}


简单工厂模式的好处在于将具体对象的产生过程进行了封装,用户不需要关系这个对象怎么来的,只需要just use it,同时有了对象工厂这个中间人,可以根据需要替换掉相应的对象,使用更加灵活。但简单工厂模式中,判断该产生何种对象时,采用了switch结构,如果需要改动或者增减对象时,需要改动switch结构的代码,不符合开放—封闭原则,即函数、类不可以修改,只能扩展。如何解决此问题,请看下回分解(大话设计模式C++版——表驱动法改造简单工厂模式)



本文为博主原创文章,如需转载请说明转至http://www.cnblogs.com/organic/
原文地址:https://www.cnblogs.com/organic/p/5005648.html