設計模式C++版_1_簡單工廠模式

本文是學習設計模式的學習筆記,文中引用瞭如下作者(書籍、博客)的內容,實例程序在《設計模式C++版》的基礎上有所改動,特此聲明。

Peixing Yang的《大話設計模式C++源代碼》
程傑的《大話設計模式》
K_Eckel的《設計模式C++版》 http://k-eckel.cnblogs.com/
EoF的<設計模式_可複用面向對象軟件的基礎>
cbf4life的《24種設計模式介紹與6大設計原則》 http://cbf4life.iteye.com/

1. 應用場景
    1.1 當有若干功能相似的類,各類之間並沒有耦合,可以用簡單工廠來實現這些類的實例化。當添加新的類的時候,不影響現有的代碼。
    1.2 父類並不知道具體要實例化哪一個具體的子類。
2. 功能
    2.1 定義創建對象的接口,封裝了對象的創建。
    2.2 使得具體化類的工作延遲到了子類中。
3. 核心思想
    用一個工廠來根據輸入的條件來產生不同的類的對象,然後根據不同類的virtual函數得到不同的結果。
4. 優點
    適用於不同情況創建不同類的對象時。
5. 缺點
    客戶端必須要知道基類和工廠類,耦合性差
6. 實例
    設計一個計算器,要求可以進行簡單的加減乘除運算。
    6.1 設計類圖
        
    6.2 程序示例
6.2.1 OperationBase.h (各種運算類)
// class section
namespace Operation
{
    class COperationBase
    {
    public:
        COperationBase(void)
        {
            m_first_num = 0.0;
            m_second_num = 0.0;
        }
        ~COperationBase(void) 
        {

        }

        inline void SetFirstNum(const double a_first_num)
        {
            this->m_first_num = a_first_num;
        }

        inline void SetSecondNum(const double a_second_num)
        {
            this->m_second_num = a_second_num;
        }

        inline double GetFirstNum()
        {
            return this->m_first_num;
        }

        inline double GetSecondNum()
        {
            return this->m_second_num;
        }

        inline virtual const double GetResult() = 0;
        
    private:
        
        double m_first_num;
        double m_second_num;
    };

    class CAddOperation : public COperationBase
    {
    public:
        inline virtual const double GetResult()
        {
            DEBUG("CAddOperation");
            return GetFirstNum() + GetSecondNum();
        }
    };

    class CSubOperation : public COperationBase
    {
    public:
        inline virtual const double GetResult()
        {
            DEBUG("CSubOperation");
            return GetFirstNum() - GetSecondNum();
        }
    };

    class CMulOperation : public COperationBase
    {
    public:
        inline virtual const double GetResult()
        {
            DEBUG("CMulOperation");
            return GetFirstNum() * GetSecondNum();
        }
    };

    class CDivOperation : public COperationBase
    {
    public:
        inline virtual const double GetResult()
        {
            DEBUG("CDivOperation");
            if (0 == GetSecondNum())
            {
                DEBUG("Second num is 0.");
                return -1;
            }
            return GetFirstNum() / GetSecondNum();
        }
    };


}

6.2.2 CalculatorFactory.h (計算器工廠類)
#include "OperationBase.h"
namespace Factory
{
    class CCalculatorFactory
    {
    public:
        CCalculatorFactory(void);
        ~CCalculatorFactory(void);

        static Operation::COperationBase *Create(char a_operator);
    };
}
6.2.3 CalculatorFactory.cpp(計算器工廠類實現)
#include "CalculatorFactory.h"


Factory::CCalculatorFactory::CCalculatorFactory(void)
{
}


Factory::CCalculatorFactory::~CCalculatorFactory(void)
{
}

Operation::COperationBase* Factory::CCalculatorFactory::Create(char a_operator)
{
    Operation::COperationBase *operation;
    switch (a_operator)
    {
    case '+':
        {
            operation = new Operation::CAddOperation();
            break;
        }
    case '-':
        {
            operation = new Operation::CSubOperation();
            break;
        }
    case '*':
        {
            operation = new Operation::CMulOperation();
            break;
        }
    case '/':
        {
            operation = new Operation::CDivOperation();
            break;
        }
    default:
        {
            break;
        }
    }
    return operation;
}

6.2.4 main 
#include <iostream>
#include "OperationBase.h"
#include "CalculatorFactory.h"

int main(int argc, char **argv)
{
    double first_num = 0;
    double sec_num = 0;
    char opertor = 0;
    double ret = 0;
    while(1)
    {
        fflush(stdin);
        std::cin >> first_num >> opertor >> sec_num;
        Operation::COperationBase *oper = Factory::CCalculatorFactory::Create(opertor);
        if (NULL == oper)
        {
            break;
        }
        oper->SetFirstNum(first_num);
        oper->SetSecondNum(sec_num);

        std::cout << oper->GetResult() << std::endl;
        if (NULL != oper)
        {
            delete(oper);
        }
    }
    
    return 0;
}

6.3 簡單工廠UML類圖































    

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