【C++設計模式二】C++工廠模式

(1)定義

簡單工廠模式中,每新增一個具體產品,就須要修改工廠類內部的判斷邏輯。爲了避免修改工廠類,遵循開閉原則,工廠方法模式中再也不使用工廠類統一建立全部的具體產品,而是針對不一樣的產品設計了不一樣的工廠,每個工廠只生產特定的產品。
定義一個用於建立對象的接口,可是讓子類決定將哪個類實例化。工廠方法模式讓一個類的實例化延遲到其子類。ios

(2)結構

工廠模式結構以下:git

  • 抽象工廠(AbstractFactory):全部生產具體產品的工廠類的基類,提供工廠類的公共方法;
  • 具體工廠(ConcreteFactory):生產具體的產品;
  • 抽象產品(AbstractProduct):全部產品的基類,提供產品類的公共方法;
  • 具體產品(ConcreteProduct):具體的產品類。

(3)實例

Factory.h設計模式

#ifndef FACTORY_H
#define FACTORY_H
#include <iostream>
#include <string>

/********************************產品類***********************************/
//抽象產品類AbstractProduct(並不是真正意義上的抽象類,含有純虛函數纔是抽象類)
class AbstractSportProduct
{
public:
	AbstractSportProduct(){}
	~AbstractSportProduct(){}
    
	//虛函數
	virtual void play(){}
};

//具體產品類Basketball
class Basketball :public AbstractSportProduct
{
public:
	Basketball(){}
	~Basketball(){}

	//具體實現方法
	void play();
};

//具體產品類Football
class Football :public AbstractSportProduct
{
public:
	Football(){}
	~Football(){}

	//具體實現方法
	void play();
};

/********************************工廠類***********************************/
//抽象工廠類
class AbstractFactory{
public:
	//純虛函數
	virtual AbstractSportProduct *getSportProduct() = 0;
};

//具體工廠類BasketballFactory
class BasketballFactory:public AbstractFactory
{
public:
	BasketballFactory(){}
	~BasketballFactory(){}

	AbstractSportProduct *getSportProduct();
};

//具體工廠類FootballFactory
class FootballFactory:public AbstractFactory 
{
public:
	FootballFactory(){}
	~FootballFactory(){}

	AbstractSportProduct *getSportProduct();
};

#endif // FACTORY_H

Factory.cpp框架

#include "Factory.h"

/********************************產品類方法***********************************/
//Basketball方法
void Basketball::play(){
	printf("play Basketball\n");
}

//Football方法
void Football::play(){
	printf("play Football\n");
}

/********************************工廠類方法***********************************/
//BasketballFactory方法
AbstractSportProduct *BasketballFactory::getSportProduct()
{
	return new Basketball();
}

//FootballFactory方法
AbstractSportProduct *FootballFactory::getSportProduct()
{
	return new Football();
}

main.cpp函數

#include "Factory.h"

int _tmain(int argc, _TCHAR* argv[])
{
	AbstractSportProduct *pro = nullptr;
	AbstractFactory *fac = nullptr;

	fac = new BasketballFactory();
	pro = fac->getSportProduct();
	pro->play();

	fac = new FootballFactory();
	pro = fac->getSportProduct();
	pro->play();
    
    return 0;
}

輸出結果:
設計

(4)總結

若是想增長棒球(Baseball)類,只須要增長一個棒球工廠(BaseballFacory),而後在客戶端代碼中修改具體工廠類的類名,而原有的類的代碼無需修改。由此可看到,相較簡單工廠模式,工廠方法模式更加符合開閉原則。工廠方法是使用頻率最高的設計模式之一,是不少開源框架和API類庫的核心模式。code

優勢:對象

  • 工廠方法用於建立客戶所需產品,同時向客戶隱藏某個具體產品類將被實例化的細節,用戶只需關心所需產品對應的工廠;
  • 工廠自主決定建立何種產品,而且建立過程封裝在具體工廠對象內部,多態性設計是工廠方法模式的關鍵;
  • 新加入產品時,無需修改原有代碼,加強了系統的可擴展性,符合開閉原則。

缺點:blog

  • 添加新產品時,須要同時添加新的產品工廠,系統中類的數量成對增長,增長了系統的複雜度,更多的類須要編譯和運行,增長了系統的額外開銷;
  • 工廠和產品都引入了抽象層,客戶端代碼中均使用的抽象層,增長了系統的抽象層次和理解難度。

(z)源碼路徑

gitee: https://gitee.com/CogenCG/DesignMode接口

相關文章
相關標籤/搜索