谈 简单工厂模式
面试的时候被考到了 ,当时一下有点乱没写出来 回来查了一下资料从新整理了一下 ,希望对以后能够以此为戒。
说到设计模式 在编程中平时很少用到 ,也是一个比较抽象的概念 一时间不知道怎么去理解,总结一下 学习一个东西 一般 5 W 2 H 5个w: what why where who when 2h: how how much
这里常用的 what : 什么东西 where 在什么地方用 when 什么时候用 how 怎么用
1 什么是工厂模式 what :
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
简单的说就是 有个一个对象工厂 来决定 具体实例化哪个对象
2. 在什么时候会用到 when:
访问数据库的时候 不同的数据 access sql sever oracle ,如果之前项目是 sql server 后来改成 Access 那么原来的项目改动就很大 ,需要重新写所有的数据库访问的代码, 很不方便, 那么我们就可以用工厂类 来 返回制定数据库操作对象,然后来进行多种 数据库的操作 ,只需要修改配置就可以了
3.怎么用 How:
引用 《大话设计模式》的例子 加 减 乘 除 运算
//定义运算类
//定义运算类 public class Operation { private string strNumberA; private string strNumberB; public string NumberA { get { return this.strNumberA; } set { this.strNumberA = value; } } public string NumberB { get { return this.strNumberB; } set { this.strNumberB = value; } } public virtual double DoResult() { double ret = 0; return ret; } }
//定义不同符号的子类继承
//加法运算 public class AddOperation : Operation { public override double DoResult() { double dRet = Convert.ToDouble(this.NumberA) +Convert.ToDouble(this.NumberB); return dRet; } }
减法运算类
//减法运算类 public class SubOperation : Operation { public override double DoResult() { //return base.DoResult(); double dRet = Convert.ToDouble(this.NumberA) - Convert.ToDouble(this.NumberB); return dRet; } }
乘法运算类
//乘法运算类 public class MulOperation : Operation { public override double DoResult() { double dRet = Convert.ToDouble(this.NumberA) * Convert.ToDouble(this.NumberB); return dRet; } }
除法运算
//除法运算 public class DevOperation:Operation { public override double DoResult() { double dRet = Convert.ToDouble(this.NumberA) / Convert.ToDouble(this.NumberB); return dRet; //return base.DoResult(); } }
工厂类
public class OperationFactory { public static Operation GetOperation(string operate) { Operation opr = null; switch (operate) { case "+": opr = new AddOperation();break; case "-": opr = new SubOperation(); break; case "*": opr = new MulOperation();break; case "/": opr = new DevOperation(); break; } return opr; } }
以后只要调用 OperationFactory.GetOperation(运算符) 就会得到 运算对象 ,这样以后添加其他的预算也非常方便,添加一新的类,给GetOperation 添加一个 case 分支就可以了 调用 obj. DoResult() 返回结果 就可以了,实现面向对象的,封装和多态