【設計模式】簡單工廠模式
以面向對象的思想和簡單工廠模式。寫一個C++計算器程序,代碼例如以下:
#include <iostream> using namespace std; class Operation { public: Operation(double left, double right) { lhs = left; rhs = right; } const double GetLeft() const { return lhs; } const double GetRight() const { return rhs; } void SetLeft(const double left) { lhs = left; } void SetRight(const double right) { rhs = right; } virtual double Calculate() = 0; // 純虛函數 protected: double lhs; double rhs; }; class Add : public Operation { public: Add(double left, double right) : Operation(left, right) {} double Calculate() { return lhs + rhs; } }; class Sub : public Operation { public: Sub(double left, double right) : Operation(left, right) {} double Calculate() { return lhs - rhs; } }; class Mul : public Operation { public: Mul(double left, double right) : Operation(left, right) {} double Calculate() { return lhs * rhs; } }; class Div : public Operation { public: Div(double left, double right) : Operation(left, right) { try { if (right == 0) throw runtime_error("The divisor cannot be 0\n"); } catch (const runtime_error &e) { cout << e.what() << endl; throw; } } double Calculate() { return lhs / rhs; } }; // 工廠函數 Operation* FactoryFunction(double left, double right, char op) { switch (op) { case '+': return new Add(left, right); break; case '-': return new Sub(left, right); break; case '*': return new Mul(left, right); break; case '/': return new Div(left, right); break; default: throw runtime_error("Operation invalid!"); break; } } int main() { Operation *add = FactoryFunction(11, 22, '+'); Operation *sub = FactoryFunction(25, 32, '-'); Operation *mul = FactoryFunction(11, 11, '*'); Operation *div = FactoryFunction(50, 8, '/'); cout << add->GetLeft() << " + " << add->GetRight() << " = " << add->Calculate() << endl; cout << sub->GetLeft() << " - " << sub->GetRight() << " = " << sub->Calculate() << endl; cout << mul->GetLeft() << " * " << mul->GetRight() << " = " << mul->Calculate() << endl; cout << div->GetLeft() << " / " << div->GetRight() << " = " << div->Calculate() << endl; div->SetLeft(40); cout << div->GetLeft() << " / " << div->GetRight() << " = " << div->Calculate() << endl; // 別忘記銷毀指針 delete add; delete sub; delete mul; delete div; system("pause"); return 0; }
執行結果:
基類Operation將運算的兩個操作數進行封裝。使用戶無法直接訪問操作數。
如果用戶要訪問或改動操作數,在基類中加入函數接口就可以。同一時候運用繼承,將詳細的操作符從基類派生出來。並依據運算符特性重寫基類中的純虛函數。這樣做的優點是可以減少耦合度。如果須要向代碼中加入新的運算符。那麽僅僅須要將新的運算符繼承自Operation基類就可以。不須要改動其他派生類中的代碼。本例使用一個工廠函數FactoryFunction來實例化對象。該工廠函數返回一個基類指針,指向派生類對象,使得用戶可以調用同樣的函數生成不同的對象。然後依據多態性質調用派生類的Calculate虛函數。UML圖例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmVzdGxlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >
參考:
《大話設計模式》第1章。
【設計模式】簡單工廠模式