前言:工廠方法模式名字上和前面第一個模式差不多,那就是簡單工廠。其實這個計算器的例子,在前面使用簡單工廠實現了一遍了。這次只是和使用相同的例子和工廠方法模式進行對比。在實現工廠方法模式的過程中發現了這個模式的優缺點!
優點:是每一個類或者功能的獨立性非常好。實現了可擴展,而不用修改其他的類。
缺點:每增加一個產品就需要增加一個產品工廠的類。
目錄
類圖:
代碼:
form窗體:
//窗體通用聲明
Operation oper =new Operation();//實例化運算類
double result = 0;//結果
//給按鈕賦值
string NumberA = "";
string NumberB = "";
//區分AB的賦值標籤,如果是fals就給A賦值。
//否則給B賦值。
bool flage = false;
//數字按鈕
private void button1_Click(object sender, EventArgs e)
{
//判斷賦值對象
if (flage)
{
NumberB += 1;
textBox1.Text = NumberB;
}
else
{
NumberA += 1;
textBox1.Text = NumberA;
}
}
//每一個數字按鈕的代碼,幾乎一摸一樣。除了代表的數字之外,
//其他的代碼完全一樣。所以就以1這個數字按鈕爲例就可以了。在這就不一一列舉了!
運算:
private void button12_Click(object sender, EventArgs e)
{
flage = true;//更改賦值標籤
//判斷是否計算
IFactory operFactory = new AddFactory();//實例化加法工廠
oper = operFactory.CreateOperation();//創建加法運算
}
private void button11_Click(object sender, EventArgs e)
{
flage = true;//更改賦值標籤
IFactory operFactory = new SubFactory();
oper = operFactory.CreateOperation();
}
private void button14_Click(object sender, EventArgs e)
{
flage = true;//更改賦值標籤
IFactory opertFactory = new MulFactory();
oper = opertFactory.CreateOperation();
}
private void button14_Click(object sender, EventArgs e)
{
flage = true;//更改賦值標籤
IFactory opertFactory = new MulFactory();
oper = opertFactory.CreateOperation();
}
private void button10_Click(object sender, EventArgs e)
{
//通過屬性,給A和B賦值。
oper.NumberA = double.Parse(NumberA);
oper.NumberB = double.Parse(NumberB);
//計算結果
result = oper.GetResult();
//顯示結果
textBox1.Text = result.ToString();
}
類:
運算類
namespace 計算器
{
/// <summary>
/// 運算類
/// </summary>
public class Operation
{
//兩個數
private double _numberA = 0;
private double _numberB = 0;
/// <summary>
/// 第一個數
/// </summary>
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}
/// <summary>
/// 第二個數
/// </summary>
public double NumberB
{
get { return _numberB; }
set { _numberB = value; }
}
/// <summary>
/// 計算方法
/// </summary>
/// <returns></returns>
public virtual double GetResult()
{
double result = 0;
return result;
}
}
}
namespace 計算器
{
/// <summary>
/// 加法類
/// </summary>
public class OperationAdd:Operation
{
/// <summary>
/// 加法
/// </summary>
/// <returns>計算結果</returns>
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;//返回結果
}//end Getresult
}
}
namespace 計算器
{
/// <summary>
/// 乘法類
/// </summary>
public class OperationMul:Operation
{
/// <summary>
/// 乘法
/// </summary>
/// <returns>結果</returns>
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}//end GetResult
}
}
namespace 計算器
{
public class OpertionDiv:Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB==0)
{
result = 0;
}
else
{
result = NumberA / NumberB;
}//end if
return result;
}//end GetResult
}
}
namespace 計算器
{
/// <summary>
/// 減法
/// </summary>
public class OperationSub:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}//end GetResult
}
}
工廠方法:
namespace 計算器
{
//工廠接口
public interface IFactory
{
Operation CreateOperation();//創建具體運算
}
}
namespace 計算器
{
public class SubFactory:IFactory
{
public Operation CreateOperation()
{
return new OperationSub();//減法
}
}
}
namespace 計算器
{
/// <summary>
/// 加法工廠
/// </summary>
public class AddFactory:IFactory
{
/// <summary>
/// 創建加法運算
/// </summary>
/// <returns></returns>
public Operation CreateOperation()
{
return new OperationAdd();//實例化加法類
}
}
}
namespace 計算器
{
public class MulFactory:IFactory
{
public Operation CreateOperation()
{
return new OperationMul();//乘法
}
}
}
namespace 計算器
{
public class DivFactory:IFactory
{
public Operation CreateOperation()
{
return new OpertionDiv();//除法
}
}
}
結果: