【C++設計模式一】C++簡單工廠模式
阿新 • • 發佈:2020-10-15
#(1)定義
定義一個簡單工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。
#(2)結構
簡單工廠模式有以下的結構:
* 工廠(Factory):根據客戶提供的具體產品類的引數,建立具體產品例項;
* 抽象產品(AbstractProduct):具體產品類的基類,包含建立產品的公共方法;
* 具體產品(ConcreteProduct):抽象產品的派生類,包含具體產品特有的實現方法,是簡單工廠模式的建立目標。
#(3)例項
SimpleFactory.h
```cpp
#ifndef SIMPLEFACTORY_H
#define SIMPLEFACTORY_H
#include
#include
//抽象產品類AbstractProduct(並非真正意義上的抽象類,含有純虛擬函式才是抽象類)
class AbstractSportProduct
{
public:
AbstractSportProduct(){}
~AbstractSportProduct(){}
//虛擬函式
virtual void printName(){}
virtual void play(){}
};
//具體產品類Basketball
class Basketball :public AbstractSportProduct
{
public:
Basketball(){}
~Basketball(){}
//具體實現方法
void printName();
void play();
};
//具體產品類Football
class Football :public AbstractSportProduct
{
public:
Football(){}
~Football(){}
//具體實現方法
void printName();
void play();
};
//工廠類
class Factory
{
public:
Factory(){}
~Factory(){}
AbstractSportProduct *getSportProduct(std::string productName);
};
#endif // TSIMPLEFACTORY_H
```
SimpleFactory.cpp
```cpp
#include "SimpleFactory.h"
//Basketball方法
void Basketball::printName(){
printf("Basketball\n");
}
void Basketball::play(){
printf("play Basketball\n");
}
//Football方法
void Football::printName(){
printf("Football\n");
}
void Football::play(){
printf("play Football\n");
}
//工廠方法
AbstractSportProduct *Factory::getSportProduct(std::string productName)
{
AbstractSportProduct *pro = NULL;
if (productName == "Basketball")
{
pro = new Basketball();
}
else if (productName == "Football")
{
pro = new Football();
}
return pro;
}
```
main.cpp
```cpp
#include "SimpleFactory.h"
int _tmain(int argc, _TCHAR* argv[])
{
Factory *fac = new Factory();
AbstractSportProduct *product = NULL;
product = fac->getSportProduct("Basketball");
product->printName();
product->play();
product = fac->getSportProduct("Football");
product->printName();
product->play();
return 0;
}
```
輸出結果:
![](https://img2020.cnblogs.com/blog/2085020/202010/2085020-20201015104952991-821438515.png)
#(3)總結
優點:
* 工廠類提供建立具體產品的方法,幷包含一定判斷邏輯,客戶不必參與產品的建立過程;
* 客戶只需要知道對應產品的引數即可,引數一般簡單好記,如數字、字元或者字串等。
缺點:
* 在擴充套件功能時,需要增加具體的產品類和修改工廠類,所以違背了開閉原則(對擴充套件開放,對修改關