概念
工廠方法模式:定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。
與簡單工廠模式對比
簡單工廠模式最大優點就是工廠類中包含了必要的邏輯判斷,可以根據不同條件動態實例化相關的類, 但如果要增加新的需求就需要改動這個工廠類,違背了開放-封閉原則。
工廠方法模式克服了這個缺點,在增加功能時,不需要改動原有的工廠類,但缺點是每增加新功能就需要增加新的類,增加了開發量。
使用場景
- 有幾個不同的類,且這幾個類有共同的父類;
- 在不同的條件下用這幾個類創造不同的對象;
- 在新增功能時,不想改動原有的類
一般步驟
- 寫一個抽象類作爲不同條件的幾個類的父類,例如寫一個“操作符類”作爲“加法類”和“減法類”的父類;
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(); } };
具體實例完整代碼
#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;
}
參考資料
《大話設計模式》