简单工厂模式只是解决对象的创建问题
完成计算器:
仅利用面向对象的封装特性,完成计算器。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calculate { class Program { static void Main(string[] args) { Console.Write("请输入数字A:"); string strNumberA = Console.ReadLine(); Console.Write("请选择运算符号(+,-,*,/):"); string strOperate = Console.ReadLine(); Console.WriteLine("请输入数字B:"); string strNumberB = Console.ReadLine(); string strResult = ""; strResult = Convert.ToString(Operation.GerResult(Convert.ToDouble(strNumberA),Convert.ToDouble(strNumberB),strOperate)); Console.WriteLine("结果是:"+strResult); Console.ReadLine(); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calculate { public class Operation { public static double GerResult(double numberA,double numberB,string operate) { double result = 0d; switch (operate) { case "+": result = numberA + numberB; break; case "-": result = numberA - numberB; break; case "*": result = numberA * numberB; break; case "/": result = numberA / numberB; break; default: break; } return result; } } }
使用封装、继承和多态 + 简单工厂模式 来完成计算器。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calculate { class Program { static void Main(string[] args) { Operation oper; oper = OperationFactory.CreateOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult(); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calculate { public class Operation { private double numberA = 0; public double NumberA { get { return numberA; } set { numberA = value; } } private double numberB = 0; public double NumberB { get { return numberB; } set { numberB = value; } } public virtual double GetResult() { double result = 0; return result; } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calculate { public class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calculate { class OperationSub:Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calculate { class OperationMul:Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calculate { class OperationDiv : Operation { public override double GetResult() { double result = 0; if (NumberB == 0) throw new Exception("除数不能为0"); result = NumberA / NumberB; return result; } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Calculate { 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; default: break; } return oper; } } }
在最后一个类operationFactory中,存在大量的switch语句。倘若今后需要增加计算方法,那么就需要为switch分支语句增加代码,使得程序还是不够灵活。
推荐做法是使用 配置文件+反射 来解决对象创建的问题。
在原本的主程序中创建对象的语句是需要传入一个字符串,用于工厂类中创建对象。
Operation oper = OperationFactory.CreateOperate("+");
这还不够灵活!(比如最常碰到的问题:程序后台数据库sqlServer要替换成oracle)
当需要生成什么对象,可以通过修改config文件来搞定,那么就极大的增加了程序的灵活性。
<add key="className" value="DbHelper的类名"/>//DBHelper的类名=程序集名字+"."+类名。 <add key="assemblyName" value="DbHelper所在的程序集的名字"/> string className=ConfigurationManager.AppSettings["className"]; static readonly string AssemblyName=ConfigurationManager.AppSettings["assemblyName"]; IDbHelper DB=Assembly.Load(AssemblyName).CreateInstance(className); 这个时候,DB.Query("strSql");就有用了