工廠方法的範例以及和簡單工廠的比較
任務 : 做一個加減乘除計算機
UML :

1.先建立一個基本的計算類別
程式碼 :
public class Operation
{
private double numberA;
public double NumberA
{
get { return numberA; }
set { numberA = value; }
}
private double numberB;
public double NumberB
{
get { return numberB; }
set { numberB = value; }
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
說明 : 將基本的計算內容實現,由於是兩個數值的計算,所以先建立number1和number2的數值待運算,之後建立GetResult()的方法把計算結果列出來。
2.在建立加、減、乘、除法類別,繼承計算類別
程式碼 :
public class OperationAdd : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
public class OperationSub : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
public class OperationMul : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
public class OperationDiv : Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB == 0)
{
throw new Exception("除數不得為0");
}
result = NumberA / NumberB;
return result;
}
}
說明 :
先繼承了父類別,所以自身就擁有了Number1,Number2和GetResult(),不過計算法不同,直接使用override複寫掉父類別的GetResult()方法,改成加減乘除的計算。
--------------------------------------------------------------------到這裡跟簡單工廠都一樣--------------------------------------------------------------------
3.建立一個計算的介面
程式碼 :
public interface IOperationFactory
{
Operation CreateOperation();
}
說明 :
建立一個介面,該介面有一個回傳Operation的CreateOperation()的方法。
4.建立每個計算類別的工廠,每個工廠都繼承了介面IOperationFactory
程式碼 :
public class AddFactory : IOperationFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
public class SubFactory : IOperationFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
public class MulFactory : IOperationFactory
{
public Operation CreateOperation()
{
return new OperationMul();
}
}
public class DivFactory : IOperationFactory
{
public Operation CreateOperation()
{
return new OperationDiv();
}
}
說明 :
每個繼承了IOperationFactory的計算工廠都必須實作該介面的方法CreateOperation(),所以每個工廠都能產出計算類別。
5.使用工廠方法
程式碼 :
static void Main(string[] args)
{
IOperationFactory operationFactory = new PowFactory();
Operation operation = operationFactory.CreateOperation();
operation.NumberA = 5;
operation.NumberB = 3;
double result = operation.GetResult();
Console.WriteLine(result);
Console.ReadLine();
}
說明 :
a.先建立一個計算工廠,需要怎樣的計算工廠由使用者決定
b.建立一個計算方法,此方法是由剛剛建立的計算工廠產出的類別
c.設定要計算的數值1、數值2。
d.取得計算後的答案
e.寫出答案
小結 :
跟上一篇的簡單工廠其實大同小異,不過先來比較一下調用者如何使用該計算機
//簡單工廠
static void Main(string[] args)
{
Operation operation = OperationFactory.CreateOperate("+");
operation.NumberA = 5;
operation.NumberB = 3;
double result = operation.GetResult();
Console.WriteLine(result);
Console.ReadLine();
}
//工廠方法
static void Main(string[] args)
{
IOperationFactory operationFactory = new PowFactory();
Operation operation = operationFactory.CreateOperation();
operation.NumberA = 5;
operation.NumberB = 3;
double result = operation.GetResult();
Console.WriteLine(result);
Console.ReadLine();
}
簡單工廠利用傳入的參數來決定工廠產生什麼計算類別
Operation operation = OperationFactory.CreateOperate("+");
工廠方法則是先決定要使用什麼計算工廠產生計算類別
IOperationFactory operationFactory = new PowFactory();
Operation operation = operationFactory.CreateOperation();
看起來沒有差很多,都能使用,但是今天要加一個方法叫做a的b次方的話,兩個模式分別要怎麼加入呢?
首先,兩者都要先加上a的b次方類別
public class OperationPow : Operation
{
public override double GetResult()
{
double result = 0;
result = Math.Pow(NumberA, NumberB);
return result;
}
}
簡單工廠擴展了"^"的分支,修改了原本的CreateOperate方法
public class OperationFactory
{
public static Operation CreateOperate(string operate)
{
Operation output = null;
switch (operate)
{
case "+":
output = new OperationAdd();
break;
case "-":
output = new OperationSub();
break;
case "*":
output = new OperationMul();
break;
case "/":
output = new OperationDiv();
break;
case "^":
output = new OperationPow();
break;
default:
break;
}
return output;
}
}
工廠方法擴展了一個工廠
public class PowFactory : IOperationFactory
{
public Operation CreateOperation()
{
return new OperationPow();
}
}
當有新需求出現需要有一個開根號的方法時呢?
簡單工廠的Switch Case會不斷長大、不斷分支(對擴展開放,對修改也開放)
工廠方法只需要建立新的工廠就能解決(對擴展開放,對修改封閉)
新手上路,若有錯誤請不吝嗇指教,謝謝。