設計模式——簡單工廠模式

通過實現計算器加減乘除功能來了解簡單工廠模式。
github地址:https://github.com/lining91/DesignPattern

普通實現遇到的問題:
需要創建一羣具體類來實現,會造成耦合的問題。
對於代碼中變化的部分和不變的部分不區分開,造成維護的成本增加。
當需要刪除已有的計算類型時,需要對現有的代碼做修改,對於不變的部分也會有影響。

簡單工廠模式實現:
爲了提高內聚和鬆耦合將一些類的公共的接口以形成抽象基類或接口。通過聲明一個指向基類的指針來指向實際的子類實現,達到了多態的目的。
通過定義創建對象的接口CreateOperation(),封裝對象的創建,不同的計算類型創建不同的對象。增加(刪除)計算類型只需要修改CreateOperation()和增加(刪除)子類。
對於具體化類的GetResult()實現,放在子類中實現。

代碼如下:
main.cpp文件

#include <iostream>
#include <stdio.h>
using namespace std;

#include "FactoryPattern.h"

void main()
{
    char cOpe = '*';
    int n1 = 33;
    int n2 = 52;

    FactoryPattern cfactory;
    Operation* pOpe = cfactory.CreateOperation(cOpe);
    if (pOpe == NULL)
    {
        cout << "輸入的計算符號不正確" << endl;
        return;
    }
    try{
        int nResult = pOpe->GetResult(n1, n2);
        cout << n1 << cOpe << n2 << " is " << nResult << endl;
    }
    catch(char* pErr)
    {
        cout << pErr << endl;
    }
    delete pOpe;
    pOpe == NULL;

    system("pause");
}

FactoryPattern.h文件

#include <stdio.h>


//  實現計算器的功能

//  操作基類
class Operation{
public:
    virtual int GetResult(int n1, int n2) = 0;

public:
    int n1;
    int n2;
};

//  加減乘數類
class OperationAdd : public Operation{
public:
    virtual int GetResult(int n1, int n2)
    {
        return n1 + n2;
    }
};


class OperationSub : public Operation{
public:
    virtual int GetResult(int n1, int n2)
    {
        return n1 - n2;
    }
};

class OperationMul : public Operation{
public:
    virtual int GetResult(int n1, int n2)
    {
        return n1 * n2;
    }
};

class OperationDiv : public Operation{
public:
    virtual int GetResult(int n1, int n2)
    {
        if (n2 == 0)
            throw "除數不能爲0!";
        return n1 / n2;
    }
};

//簡單工廠類
class FactoryPattern{
public:
    Operation* CreateOperation(char cOpe);
};

FactoryPattern.cpp文件

#include "FactoryPattern.h"

Operation* FactoryPattern::CreateOperation(char cOpe)
{
    switch(cOpe)
    {
    case ('+'):
        return new OperationAdd();
        break;
    case ('-'):
        return new OperationSub();
        break;
    case ('*'):
        return new OperationMul();
        break;
    case ('/'):
        return new OperationDiv();
        break;
    default:
        return NULL;
    }
}

運行結果如下:
這裏寫圖片描述

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