zoukankan      html  css  js  c++  java
  • 简单工厂和工厂模式

    工厂模式】:

         定义一个用于创建对象的接口, 让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

    适用性
    当一个类不知道它所必须创建的对象的类的时候。
    当一个类希望由它的子类来指定它所创建的对象的时候。
    当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

    以简单计算器为例:

    【简单工厂实现】:

    using System;

    //【简单工厂类】

    class OperationFactory

    {

      public static Operation CreateOperation(string operate)

      {

    Operation oper=null;//保存Operation类的一个引用。

    //让子类决定实例化哪一个类

    switch(operate)

    {

      case "+":

      oper=new OperationAdd();

          break;

      case "-":

      oper=new OperationSub();

          break;

      case "*":

      oper=new OperationMul();
          break;

      case "/":

      oper=new OperationDiv();
          break;

    }

    return oper;

      }

    }

    //【运算类】

    abstract class Operation 

    {

      public int NumberA;

      public int NumberB;

      public abstract void GetResult();

    }

    class OperationAdd:Operation

    {

       public override void GetResult()

       {

         Console.WriteLine("计算加法时结果为:"+(NumberA+NumberB));

       }

    }

    class OperationSub:Operation

    {

       public override void GetResult()

       {

         Console.WriteLine("计算减法时结果为:"+(NumberA-NumberB));

       }

    }

    class OperationMul:Operation

    {

       public override void GetResult()

       {

         Console.WriteLine("计算乘法时结果为:"+(NumberA*NumberB));

       }

    }

    class OperationDiv:Operation

    {

       public override void GetResult()

       {

         Console.WriteLine("计算除法时结果为:"+(NumberA/NumberB));

       }

    }

    //【客户端代码】

    class App

    {

      static void Main()

      {

        Operation oper;

    oper=OperationFactory.CreateOperation("+");

    oper.NumberA=1;

    oper.NumberB=2;

    oper.GetResult();

      }

    }

    工厂模式实现

    【工厂模式】:

    using System;

    //【运算类】

    abstract class Operation //运算基类;

    {

      public int NumberA;

      public int NumberB;

      public abstract void GetResult();

    }

    class OperationAdd:Operation //加法;

    {

       public override void GetResult()

       {

         Console.WriteLine("计算加法时结果为:"+(NumberA+NumberB));

       }

    }

    class OperationSub:Operation //减法;

    {

       public override void GetResult()

       {

         Console.WriteLine("计算减法时结果为:"+(NumberA-NumberB));

       }

    }

    class OperationMul:Operation  //乘法;

    {

       public override void GetResult()

       {

         Console.WriteLine("计算乘法时结果为:"+(NumberA*NumberB));

       }

    }

    class OperationDiv:Operation  //除法;

    {

       public override void GetResult()

       {

         Console.WriteLine("计算除法时结果为:"+(NumberA/NumberB));

       }

    }

    //【Factory接口】

    interface IFactory

    {

      Operation CreateOperaion();

    }

    //【工厂类】

    class AddFactory:IFactory//加法工厂类

    {

      public Operation CreateOperaion()

      {

        return new OperationAdd();

      }

    }

    class SubFactory:IFactory//减法工厂类

    {

      public Operation CreateOperaion()

      {

        return new OperationSub();

      }

    }

    class MulFactory:IFactory//乘法工厂类

    {

      public Operation CreateOperaion()

      {

        return new OperationMul();

      }

    }

    class DivFactory:IFactory//除法工厂类

    {

      public Operation CreateOperaion()

      {

        return new OperationDiv();

      }

    }

    //【客户端代码】

    class App

    {

      static void Main()

      {

        //真正体现对接口编程

        IFactory operFactory=new AddFactory();//实例化一个加法工厂;

        Operation oper=operFactory.CreateOperaion();

        oper.NumberA=1;

        oper.NumberB=2;

        oper.GetResult();

      }

    }

          简单工厂模式的最大优点在于:工厂类中包含了必要的判断逻辑,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

    工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,现在只改客户端了。

    工厂方法模式克服了简单工厂模式违背开放-封闭原则,又保持了封装对象创建过程的优点。工厂方法模式是简单工厂模式的进一步抽象和推广。

  • 相关阅读:
    电商拼团系统开发思路和拼团系统开发产品设计思路
    唐古拉优选拼团系统设计模式和唐古拉优选拼团系统核心代码介绍
    计算机体系结构之三--函数的调用和返回【译】
    cxv文件合并
    ubuntu18.04安装Mono及MonoDevelop,用c#开发winform
    repo怎么都下不完,原因
    repo下载安卓源码经常掉线,解决方法
    编译ad10
    ub18.04 root账户
    安卓源码导入android studio
  • 原文地址:https://www.cnblogs.com/zhangqs008/p/2802260.html
Copyright © 2011-2022 走看看