设计模式03——工厂模式

 

//factory.cpp
//工厂模式

#include <string>
#include "gtest/gtest.h"

class Operation
{
public:
    Operation() : x(0),
                  y(0)
    {}

    virtual ~Operation() {}
    int x;
    int y;
    virtual int GetResult() = 0;
};

//加法
class OperationAdd : public Operation
{
public:
    OperationAdd() {}
    virtual ~OperationAdd() {}

    virtual int GetResult()
    {
        return x+y;
    }
};


//减法
class OperationSub : public Operation
{
public:
    OperationSub() {}
    virtual ~OperationSub() {}

    virtual int GetResult()
    {
        return x-y;
    }
};


//////////////////////////////////////////////////////////////////////////
//简单工厂
class SimpleFactory
{
public:
    SimpleFactory() {}
    ~SimpleFactory() {}

    static Operation* CreateOperate(std::string op)
    {
        if (op == "+")
        {
            
            return new OperationAdd();
        }

        if (op == "-")
        {
            return new OperationSub();
        }

        return NULL;
    }

};

TEST(Factory,SimpleFactory)
{
    Operation* op;
    op = SimpleFactory::CreateOperate("+");
    op->x = 1;
    op->y = 2;
    EXPECT_EQ(3,op->GetResult());
    delete op;

    op = SimpleFactory::CreateOperate("-");
    op->x = 1;
    op->y = 2;
    EXPECT_EQ(-1,op->GetResult());
    delete op;
}


//////////////////////////////////////////////////////////////////////////
//工厂方法
class Factory
{
public:
    Factory() {}
    virtual ~Factory() {}
    
    virtual Operation* CreateOperation() = 0;
};

class FactoryAdd : public Factory
{
public:
    FactoryAdd() {}
    ~FactoryAdd() {}
    
    Operation* CreateOperation()
    {
        return new OperationAdd();
    }
};

class FactorySub : public Factory
{
public:
    FactorySub() {}
    ~FactorySub() {}

    Operation* CreateOperation()
    {
        return new OperationSub();
    }
};

TEST(Factory,Factory)
{
    Operation* op;
    Factory* factory;

    factory = new FactoryAdd();
    op = factory->CreateOperation();
    op->x = 1;
    op->y = 2;
    EXPECT_EQ(3,op->GetResult());
    delete op;
    delete factory;

    factory = new FactorySub();
    op = factory->CreateOperation();
    op->x = 1;
    op->y = 2;
    EXPECT_EQ(-1,op->GetResult());
    delete op;
    delete factory;

}

//////////////////////////////////////////////////////////////////////////

 

posted on 2018-01-06 22:32  生活的艺术  阅读(122)  评论(0)    收藏  举报