大话设计模式-——简答工厂模式
从一个简单的计算器程序来看简单工厂模式。
变化的地方就要封装,用一个单独的类来做创造实例的过程这就是工厂。
UML图:
/// <summary> /// 运算类 /// </summary> public class Operation { public double Number1 { get; set; } public double Number2 { get; set; } public virtual double GetResult() { double result = 0; return result; } }
/// <summary> /// 加法类 /// </summary> public class OprerationAdd : Operation { public override double GetResult() { double reslut = 0; reslut = Number1 + Number2; return reslut; } } /// <summary> /// 减法类 /// </summary> public class OprerationSub : Operation { public override double GetResult() { double reslut = 0; reslut = Number1 - Number2; return reslut; } } /// <summary> /// 乘法类 /// </summary> public class OprerationMul : Operation { public override double GetResult() { double reslut = 0; reslut = Number1 * Number2; return reslut; } } /// <summary> /// 除法类 /// </summary> public class OprerationDiv : Operation { public override double GetResult() { double reslut = 0; if (Number2==0) { throw new Exception("除数不能等于0"); } reslut = Number1 / Number2; return reslut; } }
运算工厂类:
public class OperationFactory { public static Operation CreateOperate(string oper) { Operation operation = null; switch (oper) { case "+": operation = new OprerationAdd(); break; case "-": operation = new OprerationSub(); break; case "*": operation = new OprerationMul(); break; case "/": operation = new OprerationDiv(); break; } return operation; } }
客户端代码:
public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); this.cbxOper.SelectedIndex = 0; } /// <summary> /// 运算点击 /// </summary> private void btnCompute_Click(object sender, EventArgs e) { double num1 = 0; double num2 = 0; if (!double.TryParse(this.txtNum1.Text,out num1)) { this.lblInfo.Text = "请输入正确的数字"; this.txtNum1.Focus(); return; } if (!double.TryParse(this.txtNum2.Text, out num2)) { this.lblInfo.Text = "请输入正确的数字"; this.txtNum2.Focus(); return; } Operation operation = null; operation = OperationFactory.CreateOperate(this.cbxOper.Text); operation.Number1 = num1; operation.Number2 = num2; double ret = operation.GetResult(); this.txtResult.Text = ret.ToString(); } }