【設計模式】工廠模式 C++ 創建型模式

簡單工廠模式

簡單工廠模式其實不難理解,我們有一間食品工廠,工廠的流水線用來生產各種口味的薯片。根據市場的要求,流水線需要隨時切換生產的口味。

那麼問題來了。假設不使用任何設計模式,那麼我們應該怎麼做?

假設不使用任何設計模式,那麼我們是不是應該將各種口味的薯片各自封裝成一個函數,然後根據不同的需求調用不同的函數?要調用不同的函數,那麼我們必須要知道代表口味的函數名稱。如果有成百上千中口味呢?

所有,簡單工廠就我個人的理解來說,就是用來統一接口的。

它有兩個主要的類,一個是產品類,這是一個接口類;二是一個工廠類,用來創建相應的對象。同時,還有許許多多的具體產品類,它們繼承產品類,重載產品類的方法,在工廠類中根據需要生產實例。

#include<iostream>
using namespace std;
/* 產品類 */
class AbstractProduct{
	public:
		virtual void GetName() = 0;
};

/* 具體產品類A */
class ProductA:public AbstractProduct{
	public:
		void GetName(){
			cout << "This is ProductA" << endl;
		}
};

/* 具體產品類B */
class ProductB:public AbstractProduct{
	public:
		void GetName(){
			cout << "This is ProductB" << endl;
		}
};

/* 工廠類 */
class Factory{
	public:
		AbstractProduct* GetProduct(int type){
			AbstractProduct *product;
            /* 通過聲明一個指向基類的指針來指向實際的子類實現,達到了多態的目的。 */
			switch(type){
				case 1:product = new ProductA();break;
				case 2:product = new ProductB();break;
				default:product = NULL;break;
			}
			return product;
		}
};

int main(){
	Factory *factory = new Factory();
	AbstractProduct *product = factory->GetProduct(2);
	product->GetName(); 
	return 0;
}

工廠方法模式

工廠方法模式跟簡單工廠模式的區別主要是:一個工廠方法類生成許多具體工廠類,每個具體工廠類只生產一個 具體產品

#include<iostream>
using namespace std;

 class AbstractProduct{
 	public:
 		virtual void GetName() = 0;
 };
 
 class AbstractFactory{
 	public:
		virtual AbstractProduct* GetProduct() = 0; 
 }; 
 
 class ProductA : public AbstractProduct{
 	public:
 		void GetName(){
 			cout << "This is ProductA" << endl;
		 }
 };

 class ProductB : public AbstractProduct{
 	public:
 		void GetName(){
 			cout << "This is ProductB" << endl;
		 }
 };
 
 class FactoryA : public AbstractFactory{
 	public:
 		AbstractProduct* GetProduct(){
 			return new ProductA();
		 }
 };
 
  class FactoryB : public AbstractFactory{
 	public:
 		AbstractProduct* GetProduct(){
 			return new ProductB();
		 }
 };
 
 int main(){
 	AbstractFactory *factory = new FactoryA();
 	AbstractProduct *product = factory->GetProduct();
 	product->GetName();
 	
 	FactoryB *factory_b = new FactoryB();
 	factory_b->GetProduct()->GetName();
 	return 0;
 }
 

抽象工廠模式

抽象工廠模式跟工廠方法模式類似,從代碼上而言,區別在於抽象類中接口的個數。

#include<iostream>
using namespace std;

 class AbstractProduct{
 	public:
 		virtual void GetName() = 0;
 };
 
 class AbstractFactory{
 	public:
		virtual AbstractProduct* GetProduct() = 0; 
 }; 
 
 class ProductA : public AbstractProduct{
 	public:
 		void GetName(){
 			cout << "This is ProductA" << endl;
		 }
 };

 class ProductB : public AbstractProduct{
 	public:
 		void GetName(){
 			cout << "This is ProductB" << endl;
		 }
 };
 
 class FactoryA : public AbstractFactory{
 	public:
 		AbstractProduct* GetProduct(){
 			return new ProductA();
		 }
 };
 
  class FactoryB : public AbstractFactory{
 	public:
 		AbstractProduct* GetProduct(){
 			return new ProductB();
		 }
 };
 
 int main(){
 	AbstractFactory *factory = new FactoryA();
 	AbstractProduct *product = factory->GetProduct();
 	product->GetName();
 	
 	FactoryB *factory_b = new FactoryB();
 	factory_b->GetProduct()->GetName();
 	return 0;
 }
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章