什么是簡單工廠模式?
簡單工廠模式根據(jù)提供給它的數(shù)據(jù)尚粘,返回一個類的實例择卦。通常它返回的類都是一個公共的父類或者接口對象。
簡單工廠的作用是實例化對象郎嫁,而不需要客戶了解這個對象屬于哪個具體的子類秉继。簡單工廠實例化的類具有相同的接口或基類,在子類比較固定并不需要擴展時泽铛,可以使用簡單工廠尚辑。
優(yōu)點:可以使用戶根據(jù)參數(shù)獲得相應的類實例,避免了直接實例化類盔腔,降低了耦合性杠茬;
缺點:實例化的類型在編譯期間已經(jīng)被確定,如果增加新類型弛随,則需要修改工作瓢喉,不符合OCP開閉原則。
簡單工廠需要知道所有要生成的類型舀透,當子類過多或者子類層次過多時不合適使用灯荧。
--引自www.cnblogs.com/lmy-foolishbird/p/5443293.html
這里我們用簡單的計算器來了解一下這個模式
public class OperationFuns
{
double numberA;
double numberB;
void Main() {
numberA = 10;
numberB = 2;
double result = OperationNum("+");
Debug.Log("結果:" + result);
}
private double OperationNum(string str) {
double result = 0;
switch (str)
{
case"+":
result = numberA + numberB;
break;
case "-":
result = numberA - numberB;
break;
case "*":
result = numberA * numberB;
break;
case "/":
result = numberA / numberB;
break;
}
return result;
}
}
這樣我們就實現(xiàn)了一個簡單的計算器功能,但是問題也來了盐杂,如果我們后期要加入新的計算方式逗载,比較加個開根號,那我們又要去加Case嗎链烈?雖然這樣也是可以厉斟,不過代碼復用性就很差,耦合度也很高强衡。把計算方法封裝起來擦秽,把每總計算方式封裝成單獨的運算類,運算類有兩個Number屬性,用于計算器的前后數(shù)感挥,還有一個GetResult虛方法缩搅,用來得到結果,每個計算類只要繼承運算類触幼,重寫里成的GetResult方法硼瓣,這樣分離了業(yè)務與計算的邏輯,這樣修改其中一個計算都不用更改其它計算置谦。但是要怎么讓計算器知道我要實例哪個算法呢堂鲤?這里簡單工廠模式就可以派上用場了。
計算基類
public class Operation {
private double numberA;
private double numberB;
//計算數(shù)A
public double NumberA {
get { return numberA; }
set { numberA = value; }
}
//計算數(shù)B
public double NumberB
{
get { return numberB; }
set { numberB = value; }
}
//得到結果
public virtual double GetResult() {
double result = 0;
return result;
}
}
各個算法
//加法
public class OperationAdd : Operation
{
public override double GetResult() {
double resoult = 0;
resoult = NumberA + NumberB;
return resoult;
}
}
//減法
public class OperationSub : Operation
{
public override double GetResult()
{
double resoult = 0;
resoult = NumberA - NumberB;
return resoult;
}
}
//乘法
public class OperationMul : Operation
{
public override double GetResult()
{
double resoult = 0;
resoult = NumberA * NumberB;
return resoult;
}
}
//除法
public class OperationDiv : Operation
{
public override double GetResult()
{
double resoult = 0;
resoult = NumberA / NumberB;
return resoult;
}
}
現(xiàn)在我們建立一個工廠類OperationFactory,工廠類的功能是根據(jù)我們的輸入幫我們選擇對應該的算法媒峡,所以我們可以寫一個方法瘟栖,傳入我們的輸入,寫義好父類Operation,在想對應該的返回父類的實例谅阿。(因為我們只要傳入?yún)?shù)得到最后的結果)半哟。
public class OperationFactory {
public static Operation OperationNumber(string str)
{
Operation oper = null;
switch (str)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
default:
Debug.Log("輸入?yún)?shù)不正確");
break;
}
return oper;
}
}
這樣我們就實現(xiàn)了簡單工廠模式,客戶端我們就只需要輸入?yún)?shù)签餐,再輸入運算符到OperationFactory.OperationNumber()方法里寓涨,最后在Operation.GetResult()得到結果。
public class OperationView {
void Mian () {
double numA = 10;
double numB = 2;
Operation oper = OperationFactory.OperationNumber("/");
oper.NumberA = numA;
oper.NumberB = numA;
double result = oper.GetResult();
Debug.Log("結果:" + result);
}
}
總結:工廠是一個單獨類創(chuàng)建實例的過程贱田,這可以讓我們的代碼維護性變強,同時可以使耦合度降低嘴脾,有時代碼也是可以優(yōu)雅的寫出來的男摧。