• 设计模式之(简单工厂模式)


          最近工作不是很忙,正好抽时间看看设计模式,园子里关于设计模式的文章已经很多了,这里就记录一下自己的学习过程了,顺便也了解一下UML类图。还是从《大话设计模式》第一章走起吧。

    简单工厂模式:

        简单工厂模式又叫静态工厂模式,就是通过定义一个类(即工厂)专门负责创建一系列具体类的实例。当然,被创建的类肯定是具有相同的父类或实现相同的接口。  

    UML图:

        

        说来惭愧,毕业两年了,还是第一次画UML类图。解释一下简单工厂模式各个角色的作用吧,就以这个加减乘除运算器为例,首先是工厂:它负责创建一系列派生类实例,这里显然是创建具体运算类的对象。工厂类返回的都是某一具体基类实例。

          抽象基类(也可以是接口):这里是运算类,主要是定义所有子类共有的方法,属性。

          具体基类:这里指加减乘除类。承自抽象基类,实例由简单工厂类创建。

    简单工厂模式代码:

         基类:抽象运算类,提供一个抽象方法:getResult() 取运算结果。

     1     public abstract class Operation
     2     {
     3         public double OperateA { get; set; }
     4         public double OperateB { get; set; }
     5 
     6         //抽象方法  派生类必须重写
     7         public abstract double getResult();
     8         //虚方法    派生类可以重写
     9         public virtual double getResultAgain() { return 0; }
    10     }
    View Code

         派生类:创建 + - * / 四个具体类。重写父类getResult()方法,实现具体运算。

     1 public class AddOperation : Operation
     2     {
     3         public override double getResult()
     4         {
     5             return OperateA + OperateB;
     6         }
     7     }
     8 
     9     public class Suboperation : Operation
    10     {
    11         public override double getResult()
    12         {
    13             return OperateA - OperateB;
    14         }
    15 
    16     }
    17 
    18     public class MulOperation : Operation
    19     {
    20         public override double getResult()
    21         {
    22             return OperateA * OperateB;
    23         }
    24     }
    25 
    26     public class DivOperation : Operation
    27     {
    28         public override double getResult()
    29         {
    30             if (OperateB == 0)
    31                 throw new Exception("除数不能为0");
    32             return OperateA / OperateB;
    33         }
    34     }
    View Code

         抽象工厂:简单的说工厂的职责是根据需求生产不同的产品,在这里就是根据具体条件,创建不同的派生类对象。

     1     public class OperationFactoroy 
     2     {
     3         public static Operation CreateOperation(string operate)
     4         {
     5             Operation oper = null;
     6             switch (operate)
     7             {
     8                 case "+":
     9                     oper = new AddOperation();
    10                     break;
    11                 case "-":
    12                     oper = new Suboperation();
    13                     break;
    14                 case "*":
    15                     oper = new MulOperation();
    16                     break;
    17                 case "/":
    18                     oper = new DivOperation();
    19                     break;
    20             }
    21             return oper;
    22         }
    23     }
    View Code

    这样基本的简单工厂就以实现,测试代码就不贴了。细想一下,以上代码还是用到了面向对象编程的继承、多态的思想的。

    (ps:平时不注意这些,今天看了下面向对象的三个特性,具体点的自己还是不清楚的,难怪毕业两年了,没什么进步。)

    网上查了一些资料,对简单工厂模式优缺点分析一下:

    有点:根据提供的条件创建具体实例(由工厂实现),无需考虑创建实例的具体细节。

    缺点:缺点就在简单工厂毕竟是个简单工厂!工厂包含了实现派生类的具体逻辑,如果派生类增加,甚至是抽象类增加,这是后就要对工厂类修改,这就违背了“开放封闭原则”。

  • 相关阅读:
    vue 虚拟列表
    图片验证
    md5 文件上传
    js中apply方法的使用
    js通过replace()方法配合正则去除空格
    使用bind()方法扩充作用域
    取数组最大最小值得方法
    css穿透点击
    为什么选择器li#id名/li.类名的写法
    子元素与父元素等高
  • 原文地址:https://www.cnblogs.com/ashleyboy/p/4396797.html
Copyright © 2020-2023  润新知