本文借鑒《大話設計模式》,算是對自己學習的總結,也希望分享下所學知識~~
什么是簡單工廠模式:就是一種實例化對象的方式县昂。
下面使用一個計算器范例,來說明什么是簡單工廠模式:
如果面試讓你實現(xiàn)一個計算器茅糜,有的人可能會這么寫七芭。
class BadCalc
{
float numberA;
float numberB;
float result;
EOperation operation = EOperation.Add;
public void DoCalc()
{
switch (operation)
{
case EOperation.Add:
result = numberA + numberB;
break;
case EOperation.Subtract:
result = numberA - numberB;
break;
case EOperation.Multiply:
result = numberA * numberB;
break;
case EOperation.Divide:
if (numberB == 0)
{
throw new DivideByZeroException();
}
else
{
result = numberA / numberB;
}
break;
}
}
}
這里需要注意2點:
1.除法為0判斷
2.命名規(guī)范
(如果寫的比這個還差,那你需要反思了蔑赘。狸驳。)
這樣寫有什么問題呢?
1.如果需要新增運算缩赛,每次運算都需要增加一個分支耙箍,還需要讓加減乘除都得參與進編譯的過程,如果不小心把加法改成了除法酥馍,就會造成不可挽回的嚴重問題了辩昆。
2.如果需要新增運算算法,就會看到其他算法的算法旨袒, 如果這個算法涉及到核心問題(比如:薪資)汁针,就會有被修改的風險。
如何改進呢砚尽?
- 思路:需要運行繼承和多態(tài)施无,把加減乘除等運算分離,修改一個不影響另外幾個必孤,增加算法也不會涉及到其他代碼猾骡。
首先提取出一個運算基類:
包含兩個運算的前后數(shù),另外有一個虛方法敷搪,用于計算得到結果兴想。
class Operation
{
public float NumberA
{
get; set;
}
public float NumberB
{
get; set;
}
public virtual float GetResult()
{
float result = 0;
return result;
}
}
其他的加減乘除都寫成了運算類的子類,繼承它(Operation)后赡勘,重寫這個虛方法(GetResult)嫂便。
class AddOperation : Operation
{
public override float GetResult()
{
float result = 0;
result = NumberA + NumberB;
return result;
}
}
class SubOperation : Operation
{
public override float GetResult()
{
float result = 0;
result = NumberA - NumberB;
return result;
}
}
class MulOperation : Operation
{
public override float GetResult()
{
float result = 0;
result = NumberA * NumberB;
return result;
}
}
class DivOperation : Operation
{
public override float GetResult()
{
float result = 0;
result = NumberA + NumberB;
return result;
}
}
這樣如果修改任何一個算法,就不需要提供其他算法的代碼了闸与。
如果需要增加復雜運算顽悼,(比如:開根號)曼振,就去增加對應的運算子類就OK。
那么新問題來了蔚龙,如何讓程序知道我使用哪一種算法呢?(加減或者是乘除)
這時候就需要使用到一種設計模式:簡單工廠設計模式映胁。
使用一個單獨的類來做這個創(chuàng)造實例的過程木羹。因為到底要實例化誰,將來會不會新增加實例化對象解孙,這都是很容易變化的地方坑填,如果直接寫到程序里new出來,會造成維護的困難弛姜,所以就需要使用到單獨的一個類脐瑰。
class OperationFactory
{
public static Operation CreateOperation(EOperation operation)
{
Operation result = null;
switch (operation)
{
case EOperation.Add:
result = new AddOperation();
break;
case EOperation.Subtract:
result = new SubOperation();
break;
case EOperation.Multiply:
result = new MulOperation();
break;
case EOperation.Divide:
result = new DivOperation();
break;
}
return result;
}
}
這樣在新增了運算算法之后,只需要在switch里面增加分支即可廷臼。
那么我們再來看一下如何使用苍在?
class GoodCalc
{
public void DoCalc()
{
Operation oper = OperationFactory.CreateOperation(EOperation.Add);
oper.NumberA = 1;
oper.NumberB = 2;
float result = oper.GetResult();
}
}
這樣看起來,程序寫的就十分完美了荠商。
只需輸入運算符號寂恬,工廠就會實例化出合適的對象,通過多態(tài)莱没,返回給父類的方式實現(xiàn)了計算器的結果初肉。
以后無論是控制臺程序、windows程序饰躲,還是手機程序牙咏,都可以用這段代碼來實現(xiàn)計算器功能。
好啦嘹裂,今天的簡單工廠模式就介紹完了妄壶,謝謝大家~