今天學了大話設計模式,書中第一章講述了簡單工廠模式,用的是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; }
測試結果:
相應的UML類圖是:
其實這樣子把操作算符封裝起來也有助於我們修改:
1、當我們需要修改除法或其他已有算法時,只需要修改相應的操作算法類即可,不必涉及到其他的操作。
2、當我們需要添加新的算法時,只需要提添加相應的新類,和在工廠類中增添switch,便可以輕松修改功能。
本文出自 “加和文的世界” 博客,請務必保留此出處http://xuyjun.blog.51cto.com/7470650/1303515