大話設計模式C++版本-05-工廠方法模式

概念

工廠方法模式:定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。

與簡單工廠模式對比

簡單工廠模式最大優點就是工廠類中包含了必要的邏輯判斷,可以根據不同條件動態實例化相關的類, 但如果要增加新的需求就需要改動這個工廠類,違背了開放-封閉原則。
工廠方法模式克服了這個缺點,在增加功能時,不需要改動原有的工廠類,但缺點是每增加新功能就需要增加新的類,增加了開發量。

使用場景

  1. 有幾個不同的類,且這幾個類有共同的父類;
  2. 在不同的條件下用這幾個類創造不同的對象;
  3. 在新增功能時,不想改動原有的類

一般步驟

  1. 寫一個抽象類作爲不同條件的幾個類的父類,例如寫一個“操作符類”作爲“加法類”和“減法類”的父類;
    class Operator // 抽象類-計算器類
    {
    public:
    	virtual void GetResult()=0;
    	void SetNumA(double numA)
    	{
    		a = numA;
    	}
    	void SetNumB(double numB)
    	{
    		b = numB;
    	}
    protected:
    	double a,b;
    };
    
  2. 寫具體的子類,並且繼承前面的抽象類;
    class OperatorAdd : public Operator //加法器類,繼承計算器類
    {
    public:
    	void GetResult()
    	{
    		printf("a+b=%lf\n",a+b);
    	}
    };
    
    class OperatorSub : public Operator // 減法器類,繼承計算器類
    {
    public:
    	void GetResult()
    	{
    		printf("a-b=%lf\n",a-b);
    	}
    };
    
  3. 寫一個工廠抽象類,並且有一個創建功能的接口;
    class IFactory  // 工廠類
    {
    public:
    	virtual Operator *CreateOperator()=0;
    };
    
  4. 寫具體的子類,繼承工廠抽象類,根據不同條件,在不同子類中實例化對象;
    class AddFactory : public IFactory
    {
    	Operator *CreateOperator()
    	{
    		return new OperatorAdd();
    	}
    };
    
    class SubFactory : public IFactory
    {
    	Operator *CreateOperator()
    	{
    		return new OperatorSub();
    	}
    };
    

具體實例完整代碼

#include<cstdio>

class Operator // 抽象類-計算器類
{
public:
	virtual void GetResult()=0;
	void SetNumA(double numA)
	{
		a = numA;
	}
	void SetNumB(double numB)
	{
		b = numB;
	}
protected:
	double a,b;
};

class OperatorAdd : public Operator //加法器類,繼承計算器類
{
public:
	void GetResult()
	{
		printf("a+b=%lf\n",a+b);
	}
};

class OperatorSub : public Operator // 減法器類,繼承計算器類
{
public:
	void GetResult()
	{
		printf("a-b=%lf\n",a-b);
	}
};

class IFactory  // 工廠類
{
public:
	virtual Operator *CreateOperator()=0;
};

class AddFactory : public IFactory
{
	Operator *CreateOperator()
	{
		return new OperatorAdd();
	}
};

class SubFactory : public IFactory
{
	Operator *CreateOperator()
	{
		return new OperatorSub();
	}
};

int main()
{
	IFactory *operFactory = new AddFactory();
	Operator *oper = operFactory->CreateOperator();
	oper->SetNumA(1.1);
	oper->SetNumB(2.2);
	oper->GetResult();
	
	return 0;
}

參考資料

《大話設計模式》

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