谈 简单工厂模式

面试的时候被考到了 ,当时一下有点乱没写出来   回来查了一下资料从新整理了一下 ,希望对以后能够以此为戒。

说到设计模式 在编程中平时很少用到 ,也是一个比较抽象的概念 一时间不知道怎么去理解,总结一下 学习一个东西 一般 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()  返回结果 就可以了,实现面向对象的,封装和多态
 
 
 
 
 
 
posted @ 2013-03-26 23:50  hzy168  阅读(196)  评论(0编辑  收藏  举报