• 简单工厂模式


    在介绍简单工厂模式之间,我们首先得清楚面向对象的三大特性:封装、继承、多态。

    封装:

    每个对象都包括自己进行操作所需要的所有信息,而不依赖于其他对象来完成自己的操作。这样的方法和属性通过类的实例来实现。

    通过良好的封装可以降低耦合度;类的内部可以自由修改;类具有对外的清晰接口。

    继承:通过对对象进行抽象父类,子类实现父类功能并可扩展。

      1.子类拥有父类非private的属性和功能(父类的构造函数例外,可以用base关键字访问,base代表着父类);

      2.子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;

      3.子类可以以自己的方式重写父类的功能。 

      缺点:父类变,子类不得不变,父子是一种强耦合的关系。

    多态:不同的对象可以执行相同的动作。

      1.子类以父类的身份出现;

      2.子类在运行时以自己的方式实现;

      3.子类以父类的身份出现时,子类特有的属性和方法不可以使用。

      为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的(virtual),子类可以选择使用override将父类的实现替换为自己的实现,这就是多态。

      原理:当方法被调用时,无论是否转换为其父类,都只有位于对象继承链最末端的方法实现会被调用。即,虚方法是按照运行时类型而非编译时类型进行动态绑定调用的。 

    简单工厂模式就是充分利用了面向对象的三大特性,将实例化对象的过程分离出来创建一个类或者是项目。

    以实现计算器为例:

    计算器,顾名思义主要功能就是计算,要实现计算,两个因素必不可少:输入参数和实现方法。所以我们定义一个运算类,包含这两个属性和方法:

     1 /// <summary>
     2     /// 运算类
     3     /// </summary>
     4     public class Operation
     5     {
     6         private double _numberA = 0;
     7         private double _numberB = 0;
     8         
     9         /// <summary>
    10         /// 数字A
    11         /// </summary>
    12         public double NumberA
    13         {
    14             get
    15             {
    16                 return _numberA;
    17             }
    18             set
    19             {
    20                 _numberA = value;
    21             }
    22         }
    23 
    24         /// <summary>
    25         /// 数字B
    26         /// </summary>
    27         public double NumberB
    28         {
    29             get
    30             {
    31                 return _numberB;
    32             }
    33             set
    34             {
    35                 _numberB = value;
    36             }
    37         }
    38 
    39         /// <summary>
    40         /// 得到运算结果
    41         /// </summary>
    42         /// <returns></returns>
    43         public virtual double getResult()
    44         {
    45             double result = 0; 
    46             return result;
    47         }
    48 
    49        
    50     }

    上面的运算类其实就是一个运算方法的抽象,包含了运算的所有元素,下面我们可以针对特定的运算方法进行扩展,如加法:

     1     /// <summary>
     2     /// 加法类
     3     /// </summary>
     4     class OperationAdd : Operation
     5     {
     6         public override double getResult()
     7         {
     8             double result = 0; 
     9             result = NumberA + NumberB;
    10             return result;
    11         }
    12     }

    当然你也可以扩展其他的操作方法。现在有了实现各种运算的类对象,那我们该什么时候实例化何种运算类呢?下面我们就要用到一个工厂类:

     1     /// <summary>
     2     /// 运算类工厂
     3     /// </summary>
     4     class OperationFactory
     5     {
     6         public static Operation createOperate(string operate)
     7         {
     8             Operation oper = null;
     9             switch (operate)
    10             {
    11                 case "+":
    12                     {
    13                         oper = new OperationAdd();
    14                         break;
    15                     }
    16                 case "-":
    17                     {
    18                         oper = new OperationSub();
    19                         break;
    20                     }
    21                 case "*":
    22                     {
    23                         oper = new OperationMul();
    24                         break;
    25                     }
    26                 case "/":
    27                     {
    28                         oper = new OperationDiv();
    29                         break;
    30                     }
    31                 case "sqr":
    32                     {
    33                         oper = new OperationSqr();
    34                         break;
    35                     }
    36                 case "sqrt":
    37                     {
    38                         oper = new OperationSqrt();
    39                         break;
    40                     }
    41                 case "+/-":
    42                     {
    43                         oper = new OperationReverse();
    44                         break;
    45                     }
    46             }
    47 
    48             return oper;
    49         }
    50     }

    创建了运算工厂类,在进行运算的时候,我们只需要实例化运算类,然后对实例赋值运算值,调用运算工厂确定运算操作:

    1 Operation oper;
    2                 oper = OperationFactory.createOperate(strOperate);
    3                 oper.NumberA = Convert.ToDouble(strNumberA);
    4                 oper.NumberB = Convert.ToDouble(strNumberB);
    5                 strResult = oper.GetResult().ToString();
    寻找突破。。。
  • 相关阅读:
    jquery组件WebUploader文件上传用法详解
    asp.net Forms身份验证详解
    FormsAuthentication使用指南
    对于新手用c#中的delegate(委托)和event(事件)
    Union All/Union/Intersect操作
    DALFactory出现"未能加载文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件”的解决方案 .
    C#多线程编程实例 线程与窗体交互
    FormsAuthentication使用指南
    asp.net Forms身份验证详解
    chrome浏览器调试JS代码
  • 原文地址:https://www.cnblogs.com/iskyoole/p/2549972.html
Copyright © 2020-2023  润新知