大話設計模式(C++)第一章-簡單工廠模式
阿新 • • 發佈:2018-11-22
問題:寫一個簡單的計算器。
普通的寫法:
#include<iostream> using namespace std; int main() { double NumberA,NumberB; cout<<"請輸入數字A: "; cin>>numberA; cout<<"請輸入數字B: "; cin>>numberB; double Result = 0; swtich(Result) { 。。。。 。。。。。。 。。。。。。。 } 。。。 。。。。。。 。。。。。。。。 cout<<"結果是:"<<Result<<endl; return 0; }
思路本身和程式碼設計本身沒有錯,但是這樣的思維卻是我們的程式只為滿足當前的需求,程式不容易維護,不容易擴充套件,更不容易複用。從而達不到高質量程式碼的要求。
採用面向物件的分析設計程式設計思想,通過封裝、繼承、多型把程式的耦合度降低,用設計模式使得程式更加靈活、容易修改、並且易於複用。
簡單工廠模式包含三個角色:
(1)工廠類Factory:工廠類是用來製造產品的。因此,在Factory中有一個用於製造產品的Create函式或者Generate函式之類的函式。這個函式能夠根據“識別符號”的不同生成不同的ConcreteProduct,當然這些ConcreteProduct都是繼承自AbstractProduct的。
(2)抽象產品類AbstractProduct(運算類):抽象產品是從其他具體產品抽象出來的。抽象產品類只有一個。
(3)具體產品類ConcreteProduct(加減乘法類):具體產品類繼承自抽象產品類,可以有多個。當需要增加新的產品的時候就增加一個繼承自抽象產品類的具體產品類即可。
三、優勢:
實現了鬆耦合,當需要增加一種新產品(在大話設計模式中,例子是 運算Operation),只需要做兩點改動:
(1)增加一個繼承自抽象產品(抽象的運算)的具體產品(一種具體的運算);
(2)在工廠類中,switch中,增加一種根據識別符號產生新運算的case即可。
C++程式碼:
#include<iostream>
#include<cstdlib>
using namespace std;
//抽象產品類
class Operation
{
protected:
double numberA;
double numberB;
public:
double getA()
{
return numberA;
}
double getB()
{
return numberB;
}
void setA(double number)
{
numberA = number;
}
void setB(double number)
{
numberB = number;
}
virtual double GetResult()
{
double result = 0;
return result;
}
};
//加減乘除類,具體的產品類
class OperationAdd :public Operation
{
public:
double GetResult()
{
double result = 0;
result = numberA + numberB;
return result;
}
};
class OperationSub :public Operation
{
public:
double GetResult()
{
double result = 0;
result = numberA - numberB;
return result;
}
};
class OperationMul :public Operation
{
public:
double GetResult()
{
double result = 0;
result = numberA * numberB;
return result;
}
};
class OperationDiv :public Operation
{
public:
double GetResult()
{
double result = 0;
if (numberB != 0)
result = numberA / numberB;
return result;
}
};
//工廠類
class OperationFactory
{
public:
Operation* createOperation(char type)
{
Operation * oper;
switch (type)
{
case '+':
oper = new OperationAdd();
break;
case '-':
oper = new OperationSub();
break;
case '*':
oper = new OperationMul();
break;
case '/':
oper = new OperationDiv();
break;
}
return oper;
}
};
int main()
{
Operation *oper = nullptr;
OperationFactory of;
oper = of.createOperation('/');
oper->setA(1);
oper->setB(2);
cout << oper->GetResult() << endl;
if (oper != nullptr)
{
delete oper;
oper = nullptr;
}
return 0;
}
參考部落格:https://blog.csdn.net/xiqingnian/article/details/40949749