C#設計模式之簡單工廠類
一、引言
如果將類比作是產品的話,那麼new一個對象就是生產出一個產品。
現在有若干個類需要我們進行選擇性的生產,那麼這時就會引出一個概念叫做工廠。
何爲工廠?
工廠就是能夠生產出各種產品的地方,生產需求根據客戶的要求生產。在程序中簡單的來說就是,可以指定一個工廠new出一個指定的類來。其他沒有選擇到的類不用new,以防資源泄露。整個new的過程全部在工廠內部完成,客戶無需干涉。
二、簡單工廠應用的場景
簡單工廠非常合適應用在同一個數據,不同的操作上。例如計算器。
如果想要對兩個數進行加/減/乘/除運算時。因爲兩個數都是一樣的,而方法可以選擇不同的。這類情況下,沒必要將加減乘除四個類全部創建實例,可以通過工廠來選擇新建需要的那個,然後進行相關計算。
三、簡單工廠模式實例
//操作基本規範,此爲父類以可看做是標準規範的接口
public class Operation
{
private double _numberA = 0;
private double _numberB = 0;
public double NumberA
{
get{ return _numberA;}
set{ _numberA = value;}
}
public double NumberB
{
get{ return _numberB;}
set{ _numberB = value;}
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
//加減乘除等具體計算類,他們全部繼承自Operation。符合一定規範
class OperationAdd : Operation //加
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
class OperationSub : Operation //減
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
class OperationMul : Operation //乘
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
class OperationDiv : Operation //除
{
public override double GetResult()
{
double result = 0;
if (NumberB == 0)
throw new Exception("除數不能爲0。");
result = NumberA / NumberB;
return result;
}
}
class OperationSqr : Operation //平方
{
public override double GetResult()
{
double result = 0;
result = NumberB * NumberB;
return result;
}
}
class OperationSqrt : Operation //平方根
{
public override double GetResult()
{
double result = 0;
if (NumberB < 0)
throw new Exception("負數不能開平方根。");
result = Math.Sqrt(NumberB);
return result;
}
}
class OperationReverse : Operation //相反數
{
public override double GetResult()
{
double result = 0;
result = -NumberB;
return result;
}
}
//運算工廠,主要是選擇性的新建某個指定的類
public class OperationFactory
{
public static Operation createOperate(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
case "*":
{
oper = new OperationMul();
break;
}
case "/":
{
oper = new OperationDiv();
break;
}
case "sqr":
{
oper = new OperationSqr();
break;
}
case "sqrt":
{
oper = new OperationSqrt();
break;
}
case "+/-":
{
oper = new OperationReverse();
break;
}
}
return oper;
}
}
//客戶端
//簡單工廠的核心在於通過工廠來選擇需要新建那一個類。從而根據選擇的類來進行相關操作
//而工廠中的類又都是符合一定標準規範,即他們都是派生自同一個父類,所以具有統一個接口
class Program
{
static void Main(string[] args)
{
try
{
Console.Write("請輸入數字A:");
string strNumberA = Console.ReadLine();
Console.Write("請選擇運算符號(+、-、*、/):");
string strOperate = Console.ReadLine();
Console.Write("請輸入數字B:");
string strNumberB = Console.ReadLine();
string strResult = "";
Operation oper;
oper = OperationFactory.createOperate(strOperate); //通過運算工廠來選擇需要新建那個類來作爲當前需要的類
oper.NumberA = Convert.ToDouble(strNumberA); //將選好的類的數值A賦值
oper.NumberB = Convert.ToDouble(strNumberB); //將選好的類的數值B賦值
strResult = oper.GetResult().ToString(); //訪問選好類中的方法返回操作結果
Console.WriteLine("結果是:" + strResult);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("您的輸入有錯:" + ex.Message);
}
}
}
四、總結
簡單運算工廠就是選擇性的創建某個指定的類的對象,其他沒用到的對象不創建。
這樣做,實際上將一個類的新建放在了工廠內部完成,客戶端使用中不需要干涉具體的實現類。只需要和工廠打交道即可。
相關關係圖如下: