(1)定義
簡單工廠模式中,每新增一個具體產品,就需要修改工廠類內部的判斷邏輯,為了不修改工廠類,遵循開閉原則,工廠方法模式中不再使用工廠類統一創建所有的具體產品,而是針對不同的產品設計了不同的工廠,每一個工廠只生產特定的產品,
定義一個用于創建物件的介面,但是讓子類決定將哪一個類實體化,工廠方法模式讓一個類的實體化延遲到其子類,
(2)結構
工廠模式結構如下:
- 抽象工廠(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類別庫的核心模式,
優點:
- 工廠方法用于創建客戶所需產品,同時向客戶隱藏某個具體產品類將被實體化的細節,用戶只需關心所需產品對應的工廠;
- 工廠自主決定創建何種產品,并且創建程序封裝在具體工廠物件內部,多型性設計是工廠方法模式的關鍵;
- 新加入產品時,無需修改原有代碼,增強了系統的可擴展性,符合開閉原則,
缺點:
- 添加新產品時,需要同時添加新的產品工廠,系統中類的數量成對增加,增加了系統的復雜度,更多的類需要編譯和運行,增加了系統的額外開銷;
- 工廠和產品都引入了抽象層,客戶端代碼中均使用的抽象層,增加了系統的抽象層次和理解難度,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/172652.html
標籤:其他
