1. 程式人生 > >大話設計模式C++版——簡單工廠模式

大話設計模式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\n", poIOperation->CalculateResult());
		
		delete poIOperation;
	}
}

簡單工廠模式的好處在於將具體物件的產生過程進行了封裝,使用者不需要關係這個物件怎麼來的,只需要just use it,同時有了物件工廠這個中間人,可以根據需要替換掉相應的物件,使用更加靈活。但簡單工廠模式中,判斷該產生何種物件時,採用了switch結構,如果需要改動或者增減物件時,需要改動switch結構的程式碼,不符合開放—封閉原則,即函式、類不可以修改,只能擴充套件。如何解決此問題,請看下回分解(大話設計模式C++版——表驅動法改造簡單工廠模式)