今天學了大話設計模式,書中第一章講述了簡單工廠模式,用的是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