程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 大話設計模式學習筆記-簡單工廠模式(c++描述)

大話設計模式學習筆記-簡單工廠模式(c++描述)

編輯:關於C語言

今天學了大話設計模式,書中第一章講述了簡單工廠模式,用的是C#來描述,於是我在學習之余將書中描述的內容以C++的形式重寫一遍,以作加深自己的學習印象。


首先什麼是“簡單工廠模式”,應該是:用一個單獨的類來做創造實例的過程。大話設計模式P10)


書中用到的例子是小型的計算器,對應有多種操作算符。等待輸入操作數和操作算符以後,根據輸入的符號來生產用於計算的操作,這就是這次“簡單工廠模式”的應用。


以下是我用C++描述的代碼:

為簡便我省略掉頭文件和命名空間的聲明。

//操作算符的抽象類
class Operation {
public:
    double numberA;    //2個操作數
    double numberB;
    virtual double GetResult() const = 0;    //用於計算的操作
};


以下分別是加法“+”、減法“-”、乘法“*”和除法“/”的操作定義

//加法
class OperationAdd : public Operation {
public:
    double GetResult() const {
        return numberA + numberB;
    }
};
//減法
class OperationSub : public Operation {
public:
    double GetResult() const {
        return numberA - numberB;
    }
};
//乘法
class OperationMul : public Operation {
public:
    double GetResult() const {
        return numberA * numberB;
    }
};
//除法,考慮到除數可能為0的情況,這裡利用標准庫的數值類numeric_limits<>來輸出double的最大值。
class OperationDiv : public Operation {
public:
    double GetResult() const {
        if (numberB == 0)
            return numeric_limits<double>::max();
        else
            return numberA / numberB;
    }
};


操作算符都定義好以後,我們開始工廠類。

//工廠類
class OperationFactory {
public:
    static Operation* createOperation(char c) {
        switch (c) {
        case '+':
            return new OperationAdd();
        case '-':
            return new OperationSub();
        case '*':
            return new OperationMul();
        case '/':
            return new OperationDiv();
        }//利用switch來檢測輸入了哪個操作算符
    }
};


現在我們在客戶端中測試一下以上的類。

int main() {
        //為了方便,以下都是沒有檢測輸入的結果是否正確
    double numberA = 0, numberB = 0;
    char oper;
    cout << "請輸入第一個操作數: ";
    cin >> numberA;
    cout << "請輸入操作算符:";
    cin >> oper;
    cout << "請輸入第二個操作數: ";
    cin >> numberB;
        //利用工廠類的靜態方法創建出操作算符的對象
    Operation *operation = OperationFactory::createOperation(oper);
    operation->numberA = numberA;
    operation->numberB = numberB;
        //利用算符對象的方法得出結果
    cout << "結果為:" << operation->GetResult() << endl;
    return 0;
}


測試結果:

164042178.jpg


相應的UML類圖是:

164058371.jpg


其實這樣子把操作算符封裝起來也有助於我們修改:

1、當我們需要修改除法或其他已有算法時,只需要修改相應的操作算法類即可,不必涉及到其他的操作。

2、當我們需要添加新的算法時,只需要提添加相應的新類,和在工廠類中增添switch,便可以輕松修改功能。


本文出自 “加和文的世界” 博客,請務必保留此出處http://xuyjun.blog.51cto.com/7470650/1303515

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved