最近才開始看設計模式,想想這玩意本來應該在大學的時候就應該瞭解的東西,到現在了竟然只瞭解到皮毛,慚愧啊~~~
話說這是從一個計算機的案例來引發的思考,現在我想做一個計算機,包含加減乘除運算;
考慮下,設計這個類,一般的設想是直接設計一個運算類,裡麵包含加減乘除運算的介面,然後就可以完工了。
可是,真的是這樣嗎?如果我們想再增加一個乘方運算,怎麼辦呢?直接在運算類裡面寫?這顯然違背了設計的開閉原則。而且,再想一
想,這樣設計的類,耦合度想到高,如果要更改某一個運算方式,就必須再次開啟運算類,這樣做,估計老闆要發怒的了。
於是,我們考慮一種簡單工程模式,把具體的類和實現部分分開,結構圖如下:
這樣做,如果我們要增加新的運算,只需要增加新的運算類,然後才工廠中註冊新的產品就可以了;
代碼實現:
//運算基類
#include <iostream>
#ifndef OPERATION
#define OPERATION
class Operation
{
public:
virtual double GetResult(double numA, double numB);
protected:
private:
};
#endif
#include "Operation.h"
//加法類
#ifndef OPERATIONADD
#define OPERATIONADD
class OperationAdd:public Operation
{
public :
double GetResult(double numA, double numB);
protected:
private:
};
#endif
//工廠
#ifndef SIMPLEFACTORY
#define SIMPLEFACTORY
class SimpleFactory
{
public:Operation *CreatOperation(char operate);
};
#endif
//工廠的實現
Operation *SimpleFactory::CreatOperation(char operate)
{
Operation *oper = NULL;
switch (operate)
{
case '+':oper = new OperationAdd;
break;
case '-':oper = new OperationSub;
break;
case '*':oper = new OperationMul;
break;
case '/':oper = new OperationDiv;
break;
default:oper = new OperationAdd;
break;
}
return oper;
}
用戶端
int main(void)
{
double numA = 20;
double numB = 13;
Operation *oper = NULL;
SimpleFactory simFac;
oper = simFac.CreatOperation('/');
double result = oper->GetResult(numA, numB);
std::cout<<"numA / numB 's result is:"<<result<<std::endl;
system("pause");
return 0;
}
說明:
/*
*優點:符合物件導向4大原則:可維護,可複用,可擴充,靈活性高,耦合度低
*缺點:如果要增加新的產品,必須對工廠進行修改,這違背了軟體設計的開閉原則
*/