【C++設計模式一】C++簡單工廠模式

(1)定義

定義一個簡單工廠類,它能夠根據參數的不一樣返回不一樣類的實例,被建立的實例一般都具備共同的父類。ios

(2)結構

簡單工廠模式有如下的結構:git

  • 工廠(Factory):根據客戶提供的具體產品類的參數,建立具體產品實例;
  • 抽象產品(AbstractProduct):具體產品類的基類,包含建立產品的公共方法;
  • 具體產品(ConcreteProduct):抽象產品的派生類,包含具體產品特有的實現方法,是簡單工廠模式的建立目標。

(3)實例

SimpleFactory.h函數

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

//抽象產品類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.cppcode

#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.cppblog

#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;
}

輸出結果:
字符串

(4)總結

優勢:get

  • 工廠類提供建立具體產品的方法,幷包含必定判斷邏輯,客戶沒必要參與產品的建立過程;
  • 客戶只須要知道對應產品的參數便可,參數通常簡單好記,如數字、字符或者字符串等。

缺點:源碼

  • 在擴展功能時,須要增長具體的產品類和修改工廠類,因此違背了開閉原則(對擴展開放,對修改關閉)。

(z)源碼路徑

gitee: https://gitee.com/CogenCG/DesignModestring

相關文章
相關標籤/搜索