1. 程式人生 > >C++設計模式學習筆記03_工廠方法1

C++設計模式學習筆記03_工廠方法1

0、工廠方法

1、繼續前面的總結,前面說到,當工廠需要生產新的產品時,簡單工廠模式需要我們對程式碼進行修改,而且不是程式碼的擴充套件,而是程式碼比較底層的修改了,因此會帶來很多後期測試等等的問題,工廠方法模式應運而生
2、工廠方法簡單來說就是利用了C++的抽象類(定義了純虛擬函式的類),將產品繼承在該抽象類下,定義一個抽象類(產品),產品都繼承該抽象類,工廠每次根據需要,產生對應的產品
3、工廠也定義一個抽象類,生產不同的產品,則建起不同的工廠
4、在工廠方法的模式下,若是希望引入一種新的產品,只需要定義一個新的類,將該類繼承在定義好的產品抽象類下,在建起(引入)新的工廠用來生產新的產品
5、不同產品由不同的工廠生產,在程式看來似乎是有些繁瑣,不過程式碼從邏輯上看起來則很清晰
#include <iostream>
using namespace std;

class Product
{
public:
	virtual void ShowYouself() = 0;
private:

};

class ProtuctA : public Product
{
public:
	void ShowYouself()
	{
		cout << "建立了A" << endl;
	}
private:
};

class ProtuctB : public Product
{
public:
	void ShowYouself()
	{
		cout << "建立了B" << endl;
	}
private:
};
//******************************以下是工廠*****************************
class Fectory
{
public:
	virtual Product *CreateProtect() = 0;
};

class FectoryA : public Fectory
{
public:
	Product *CreateProtect()
	{
		cout << "來到工廠A" << endl;
		return new ProtuctA;
	}
};

class FectoryB : public Fectory
{
public:
	Product *CreateProtect()
	{
		cout << "來到工廠B" << endl;
		return new ProtuctB;
	}
};
//********************************************************
int main(void)
{
	Fectory *fectoryA = new FectoryA();
	Fectory *fectoryB = new FectoryB();

	Product *protectA = fectoryA->CreateProtect();
	Product *protectB = fectoryB->CreateProtect();
	protectA->ShowYouself();
	protectB->ShowYouself();

	if (protectA != NULL)
	{
		cout << "protectA被回收" << endl;
		delete protectA;
		protectA = NULL;
	}
	if (protectB != NULL)
	{
		cout << "protectB被回收" << endl;
		delete protectB;
		protectB = NULL;
	}
	if (fectoryA != NULL)
	{
		cout << "fectoryA被回收" << endl;
		delete fectoryA;
		fectoryA = NULL;
	}
	if (fectoryB != NULL)
	{
		cout << "fectoryB被回收" << endl;
		delete fectoryB;
		fectoryB = NULL;
	}
	system("pause");
	return 0;
}
6、於是乎又出現了一種情況,如果現在希望生產一個新的產品,在工廠方法的模式下,我們需要建立新的產品類,新的工廠類,那麼會不會有這麼一種情況,新的產品和之前的產品存在著某種關係(比如電腦顯示屏和電視顯示屏),那麼顯然我們需要的是讓原來生產電腦顯示屏的工廠加一條生產電視顯示屏的生產線即可,於是抽象工廠類應運而生…