zoukankan      html  css  js  c++  java
  • 设计模式之(简单工厂模式)

          最近工作不是很忙,正好抽时间看看设计模式,园子里关于设计模式的文章已经很多了,这里就记录一下自己的学习过程了,顺便也了解一下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:平时不注意这些,今天看了下面向对象的三个特性,具体点的自己还是不清楚的,难怪毕业两年了,没什么进步。)

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

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

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

  • 相关阅读:
    2005226考勤登记
    2005219考勤登记
    2005225考勤登记
    2005224考勤登记
    2005222考勤登记
    116道iOS面试题+答案,希望对你的面试有帮助
    在线代码编辑器(Ace)被防火墙误杀
    使用Certbot实现阿里云泛域名证书的自动续期
    实时音视频入门学习:开源工程WebRTC的技术原理和使用浅析
    百善孝为先
  • 原文地址:https://www.cnblogs.com/ashleyboy/p/4396797.html
Copyright © 2011-2022 走看看