zoukankan      html  css  js  c++  java
  • 工厂方法模式

    前一篇文章介绍了简单工厂模式以及如何使用简单工厂模式来实现计算器。

    但是简单工厂模式有个问题,就是当我们需要扩展运算操作的时候,我们需要修改整个运算工厂类,或者说整个运算工厂类都必须开发才能允许操作扩展,这违背了开发-封闭原则,这是我们就需要工厂方法模式了。也就是说工厂方法模式必须定义一个用于创建对象的接口,让子类决定实例化哪个对象。

    也就是说,工厂方法模式把简单工厂模式的内部逻辑判断移到了客户端来判断,由客户端决定来实例化哪个对象。

    以实现计算器为例,对运算操作功能进行扩展时,我们不再需要在运算工厂类中新增case判断,只需要新增一个相应功能的运算类和工厂类即可。

    1     /// <summary>
    2     /// 工厂方法
    3     /// </summary>
    4     interface IFactory
    5     {
    6         Operation CreateOperation();
    7     }
     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 AddFactory : IFactory
     5     {
     6         public Operation CreateOperation()
     7         {
     8             return new OperationAdd();
     9         }
    10     }

    如果需要新增加法运算,我们只需要新增上面的加法类和负责生产“+”的工厂,不再需要像简单工厂模式去修改整个工厂类,让工厂类暴露在外面。

    客户端调用:

    1 IFactory operFactory = new AddFactory();
    2             Operation oper = operFactory.CreateOperation();
    3             oper.NumberA = 1;
    4             oper.NumberB = 2;
    5             double result=oper.GetResult();
    6 
    7             Console.WriteLine(result);
    8 
    9             Console.Read();

    将对运算操作实例化的判断从简单工厂模式的工厂类中移到了客户端进行。

    寻找突破。。。
  • 相关阅读:
    解决ASP.NET MVC AllowAnonymous属性无效导致无法匿名访问控制器的问题
    ASP.NET MVC 4 RC的JS/CSS打包压缩功能 (转载)
    oracle报错ORA-01507
    oracle 大表删除数据后,回收空间的问题。
    解决MySQL服务启动时报1067错误
    尚未在 Web 服务器上注册 ASP.NET 4.0” 的解决办法
    thymeleaf中相对路径的两种方式
    史上最详 Thymeleaf 使用教程
    isNotBlank()和isNotEmpty()总结
    IDEA去除掉虚线,波浪线,和下划线实线的方法
  • 原文地址:https://www.cnblogs.com/iskyoole/p/2552315.html
Copyright © 2011-2022 走看看