1.由于上一篇的策略,我们可以看出来,如果有更多的算法法类,我们客户端要手动添加,很麻烦。因此通过添加一个工厂类,上层只传递一个字符串就可以实现创建不同的算法。这样的我们可以结合策略模式和工厂模式的思想。
#include <iostream> using namespace std; // Define the strategy type typedef enum StrategyType { StrategyA, StrategyB, StrategyC }STRATEGYTYPE; // The abstract strategy class Strategy { public: virtual void AlgorithmInterface() = 0; virtual ~Strategy() = 0; // 谢谢hellowei提出的bug,具体可以参见评论 }; Strategy::~Strategy() {} class ConcreteStrategyA : public Strategy { public: void AlgorithmInterface() { cout << "I am from ConcreteStrategyA." << endl; } ~ConcreteStrategyA(){} }; class ConcreteStrategyB : public Strategy { public: void AlgorithmInterface() { cout << "I am from ConcreteStrategyB." << endl; } ~ConcreteStrategyB(){} }; class ConcreteStrategyC : public Strategy { public: void AlgorithmInterface() { cout << "I am from ConcreteStrategyC." << endl; } ~ConcreteStrategyC(){} }; class Context { public: Context(STRATEGYTYPE strategyType) { switch (strategyType) { case StrategyA: pStrategy = new ConcreteStrategyA; break; case StrategyB: pStrategy = new ConcreteStrategyB; break; case StrategyC: pStrategy = new ConcreteStrategyC; break; default: break; } } ~Context() { if (pStrategy) delete pStrategy; } void ContextInterface() { if (pStrategy) pStrategy->AlgorithmInterface(); } private: Strategy *pStrategy; }; int main() { Context *pContext = new Context(StrategyA); pContext->ContextInterface(); if (pContext) delete pContext; }
2.简单工厂模式和抽象工厂模式
简单:一个工厂负责多个产品。
抽象:一个工厂负责多个产品,但两个产品实现同一个功能,举个例子两个算法实现对比度增强,这个时候就可以把这个产品类抽象出来,由两个具体算法来继承。