大話設計模式:簡單工廠模式
由於程式導向程式設計造成的程式碼膨脹問題越來越嚴重,使其維護的代價高,靈活性很低。為了使程式碼易維護、易擴充套件、易複用和靈活性好,所以我們在採用物件導向程式設計的時候,防止採用物件導向的語言實際上卻做著程式導向的事兒,更需要採用某種設計模式,核心就是使程式變得高內聚,低耦合,這樣的程式才能達到上面的四個優點。而簡單工廠模式的出現也正是為了達到這樣一種效果,將工廠和產品分塊,具體解決了例項化那個物件(具體產品)的需求。從而實現了高內聚,低耦合。使程式易維護、易擴充套件、易複用和靈活性好。同時也用到了物件導向程式設計的三大特性:繼承、多型、封裝。
簡單工廠模式主要包括以下幾個模組:
(1)工廠類Factory:在Factory中有一個用於製造產品的Create函式,用於製造產品。裡面有個switch-case語句,這個函式能夠根據“識別符號”的不同生成不同的ConcreteProduct,當然這些ConcreteProduct都是繼承自AbstractProduct的。
(2)抽象產品類:AbstructProduct:抽象產品是從其他具體產品抽象出來的。抽象產品類只有一個。
(3)具體產品類ConcreteProduct:具體產品類繼承自抽象產品類,可以有多個。
以書上的計算器為例:
優點:實現了低耦合。當需要增加一種新產品(以新增開根號運算為例),只需要做兩點改動:
(1)增加一個繼承自抽象產品--抽象運算--的具體產品(新增一個開根號的類,繼承Operation類);
(2)在工廠中,switch中,增加一種根據識別符號產生新運算的case即可(新增一個case的變數,開根號);
缺點:只能生產一種型別的產品,該產品都繼承抽象產品類(該書中所指的就是運算類:Operation類,每種具體的運算(+-*/)都需要繼承該類。但是如果後來我們需要播放一首歌曲或者畫出不同圖形這樣的功能,這個簡單工廠模式就不行了,具體實現思想後面再介紹。因為它只能實現某一類抽象的產品,)。
其UML圖如下:
其具體實現程式碼:
簡單工廠模式主要包括以下幾個模組:
(1)工廠類Factory:在Factory中有一個用於製造產品的Create函式,用於製造產品。裡面有個switch-case語句,這個函式能夠根據“識別符號”的不同生成不同的ConcreteProduct,當然這些ConcreteProduct都是繼承自AbstractProduct的。
(2)抽象產品類:AbstructProduct:抽象產品是從其他具體產品抽象出來的。抽象產品類只有一個。
(3)具體產品類ConcreteProduct:具體產品類繼承自抽象產品類,可以有多個。
以書上的計算器為例:
優點:實現了低耦合。當需要增加一種新產品(以新增開根號運算為例),只需要做兩點改動:
(1)增加一個繼承自抽象產品--抽象運算--的具體產品(新增一個開根號的類,繼承Operation類);
(2)在工廠中,switch中,增加一種根據識別符號產生新運算的case即可(新增一個case的變數,開根號);
缺點:只能生產一種型別的產品,該產品都繼承抽象產品類(該書中所指的就是運算類:Operation類,每種具體的運算(+-*/)都需要繼承該類。但是如果後來我們需要播放一首歌曲或者畫出不同圖形這樣的功能,這個簡單工廠模式就不行了,具體實現思想後面再介紹。因為它只能實現某一類抽象的產品,)。
其UML圖如下:
其具體實現程式碼:
#include <iostream>
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=NULL;
OperationFactory of;
oper=of.createOperation('+');
oper->setA(3);
oper->setB(2);
cout<<oper->GetResult()<<endl;
if(oper!=NULL)
{
delete oper;
oper=NULL;
}
system("pause");
return 0;
}
執行結果:
相關文章
- 【大話設計模式】——簡單工廠模式設計模式
- 大話設計模式筆記の 簡單工廠模式設計模式筆記
- 大話設計模式:工廠模式設計模式
- 大話設計模式讀書筆記1——簡單工廠模式設計模式筆記
- 大話設計模式:抽象工廠模式設計模式抽象
- 【大話設計模式】—— 工廠方法模式設計模式
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- 設計模式 - 簡單工廠模式設計模式
- 【設計模式】簡單工廠模式設計模式
- 設計模式——簡單工廠模式設計模式
- 設計模式-簡單工廠模式設計模式
- C# 設計模式(1)——簡單工廠模式、工廠模式、抽象工廠模式C#設計模式抽象
- 設計模式之簡單工廠模式設計模式
- java設計模式-簡單工廠模式Java設計模式
- 設計模式(一)—— 簡單工廠模式設計模式
- 簡單工廠模式(設計模式02)設計模式
- 設計模式----簡單工廠設計模式
- 無廢話設計模式(1)--簡單工廠、工廠方法、抽象工廠設計模式抽象
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- 設計模式入門-簡單工廠模式設計模式
- golang設計模式之簡單工廠模式Golang設計模式
- 【Linux】設計模式-----簡單工廠模式Linux設計模式
- Java設計模式2:簡單工廠模式Java設計模式
- Java設計模式(一) 簡單工廠模式不簡單Java設計模式
- 設計模式(一):簡單工廠設計模式
- iOS設計模式 - 簡單工廠iOS設計模式
- 簡單工廠模式—>工廠模式模式
- 23種設計模式(一)---簡單工廠設計模式設計模式
- 設計模式 --並不簡單的工廠模式設計模式
- 設計模式系列之一:簡單工廠模式設計模式
- Yii2設計模式——簡單工廠模式設計模式
- Java常用設計模式之簡單工廠模式Java設計模式
- 工廠模式之簡單工廠模式模式
- c#簡單工廠設計模式C#設計模式
- 極簡設計模式-工廠模式設計模式
- 簡單工廠模式、工廠模式、抽象工廠模式比較模式抽象
- 設計模式 | 簡單工廠模式及典型應用設計模式
- 設計模式-簡單工廠模式概述和使用-介面設計模式