前言:
簡單工廠模式是這23個模式裏的第一個模式,也是比較簡單和體現非常明確的一個模式。通過簡單工廠可以非常好的體驗出面向對象編程的好處,面向對象概念的重要性。也算是通過這個模式體驗設計模式的好處把!
目錄
概念:
根據客戶端的選擇進行動態的實例化對象,也就是根據用戶的需求來實例化具體的對象。
需求:
實現一個有加減乘除的計算器,利用簡單工廠模式實現。
實現:
業務邏輯:
運算基類:
/// <summary>
/// 計算類
/// </summary>
public class Operation
{
private double _numberA = 0;
private double _numberB = 0;
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}//end NumberA
public double NumberB
{
get { return _numberB; }
set { _numberB = value; }
}//end NumberB
//計算方法--虛方法
public virtual double GetResult()
{
double result = 0;
return result;
}
}//end Pperaton
運算具體的派生類:
/// <summary>
/// 加法運算,繼承運算類。
/// </summary>
class OpertionAdd : Operation
{
//重新父類的計算方法
public override double GetResult()
{
double result = 0;//計算結果
result = NumberA + NumberB;//具體運算
return result;//返回結果
}//end Getresult
}//end OpertonAdd
/// <summary>
/// 減法
/// </summary>
class OpertiononSub : Operation
{
//重新父類的計算方法
public override double GetResult()
{
double result = 0;//計算結果
result = NumberA - NumberB;//具體運算
return result;//返回結果
}//end Getresult
}//end OPertionsub
/// <summary>
/// 乘法
/// </summary>
class OpertionMul : Operation
{
//重新父類的計算方法
public override double GetResult()
{
double result = 0;//計算結果
result = NumberA * NumberB;//具體運算
return result;//返回結果
}//end Getresult
}//end OpertionMul
/// <summary>
/// 除法
/// </summary>
class OpertionDiv : Operation
{
//重新父類的計算方法
public override double GetResult()
{
double result = 0;//計算結果
if (NumberB == 0)
throw new Exception("除數不能爲0.");
result = NumberA / NumberB;//具體運算
return result;//返回結果
}//end Getresult
}
//end OpertionDiv
運算工廠:
/// <summary>
/// 簡單工廠類,根據需求實例化類。
/// </summary>
public class OperationFactory
{
/// <summary>
/// 實例化具體的運算類
/// </summary>
/// <param name="operate">運算符</param>
/// <returns>返回具體實例化的類</returns>
public static Operation createOperate(string operate)
{
Operation oper = null;//實例化父類,從新賦值。
//判斷
switch (operate)
{
case "+":
//把父類,轉換成子類
oper = new OpertionAdd();//實例化加法類
break;
case "-":
//把父類,轉換成子類
oper = new OpertiononSub();//實例化減法類
break;
case "*":
//把父類,轉換成子類
oper = new OpertionMul();//實例化乘法類
break;
case "/":
//把父類,轉換成子類
oper = new OpertionDiv();//實例化除法類
break;
}//end swithc
//返回結果
return oper;
}
}//end OperationFactory
客戶端:
//確定按鈕
private void button1_Click(object sender, EventArgs e)
{ //運算類
Operation ope;
//從新給父類,賦值。
ope = OperationFactory.createOperate(txt2.Text); //運算符
ope.NumberA = int.Parse(txt1.Text);//給A賦值
ope.NumberB =int.Parse( txt3.Text);//給B賦值
//調用計算方法,輸出結果。
double result = ope.GetResult();
txt4.Text = result.ToString();
}