c++设计模式:工厂模式

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.简单工厂模式和抽象工厂模式

简单:一个工厂负责多个产品。

抽象:一个工厂负责多个产品,但两个产品实现同一个功能,举个例子两个算法实现对比度增强,这个时候就可以把这个产品类抽象出来,由两个具体算法来继承。

上一篇:2020年11月阅读文章


下一篇:How to install GCC/G++ 8 on CentOS