1. 程式人生 > 其它 >C++設計模式之工廠方法模式詳解(對比簡單工廠)

C++設計模式之工廠方法模式詳解(對比簡單工廠)

技術標籤:設計模式c++設計模式工廠方法模式

前面的文章詳細介紹了單例模式簡單工廠模式,有需要的可以點選連結去看看。之前說到,簡單工廠模式有一個最大的弊端就是它違背了開放封閉原則,因為如果需要新增功能,則需要工廠類的內部,這違背了對修改關閉的設計原則。為了解決這個問題,工廠方法模式就誕生了。

工廠方法:定義了一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。通俗一點講工廠方法和簡單工廠的區別在於:簡單工廠只有一個工廠類,且其中包含了所有可能的操作,根據傳入引數的不同返回不同的物件,而工廠方法中,除了有一個工廠類(基類)之外,每個功能還存在一個派生類,客戶可以根據自己的需求去例項化不同的物件。

#include<iostream>

using namespace std;
//工廠方法模式:定一個一個建立物件的介面,讓子類決定例項化那一個類。工廠方法使一個類的例項化延遲到子類
//如果增加新的功能,則只需要增加該操作類和該操作的工廠類,這樣全程就對修改關閉了

//操作類
class Operation {
private:
	int numberA;
	int numberB;//兩個私有資料

public:
	//四個公有方法來設定和獲取資料
	int getNumberA()
	{
		return numberA;
	}
	void setNumberA(int value)
	{
		numberA = value;
	}

	int getNumberB()
	{
		return numberB;
	}
	void setNumberB(int value)
	{
		numberB = value;
	}

	virtual int getresult() = 0;//純虛擬函式
};

//加法類
class Add :public Operation {
public:
	int getresult()
	{
		return  getNumberA() + getNumberB();
	}
};

//減法類
class Sub :public Operation {
public:
	int getresult()
	{
		return  getNumberA() - getNumberB();
	}
};

//除法類
class Div :public Operation {
public:
	int getresult()
	{
		if (getNumberB() == 0)
		{
			cout << "除數不能為0" << endl;
			return 0;
		}
		return  getNumberA() / getNumberB();
	}
};

//乘法類
class Prod :public Operation {
public:
	int getresult()
	{
		return  getNumberA() * getNumberB();
	}
};


//工廠基類(簡單工廠只有這一個工廠類,例項化也在該類中)
class Factoryoper {
public:
	virtual	Operation* createOperation() = 0;//純虛擬函式
};

//工廠方法是需要哪個功能就例項化哪個物件,讓客戶去決定,派生出具體的功能類
//加法工廠
class addFactory :public Factoryoper {
public:
	Operation* createOperation()
	{
		return new Add();
	}
};

//減法工廠
class subFactory :public Factoryoper {
public:
	Operation* createOperation()
	{
		return new Sub();
	}
};

//除法工廠
class divFactory :public Factoryoper {
public:
	Operation* createOperation()
	{
		return new Div();
	}
};

//乘法工廠
class prodFactory :public Factoryoper {
public:
	Operation* createOperation()
	{
		return new Prod();
	}
};



int main()
{
	
	Factoryoper* operFactory1 = new addFactory();//加法工廠
	Operation* oper1 = operFactory1->createOperation();//加法例項
	oper1->setNumberA(10);
	oper1->setNumberB(20);
	int res = oper1->getresult();//得到結果
	cout << res << endl;

	Factoryoper* operFactory2 = new subFactory();
	Operation* oper2 = operFactory2->createOperation();
	oper2->setNumberA(10);
	oper2->setNumberB(20);
	cout << oper2->getresult()<< endl;

	Factoryoper* operFactory3 = new divFactory();
	Operation* oper3 = operFactory3->createOperation();
	oper3->setNumberA(60);
	oper3->setNumberB(3);
	cout << oper3->getresult() << endl;

	Factoryoper* operFactory4 = new prodFactory();
	Operation* oper4 = operFactory4->createOperation();
	oper4->setNumberA(60);
	oper4->setNumberB(3);
	cout << oper4->getresult() << endl;


	system("pause");
	return 0;
}

程式碼中關鍵地方都註釋了,相信大家也能看懂,歡迎交流討論哈。