• 设计模式


    简单工厂模式:
    考虑代码的 可维护性可重用性可扩展性灵活性

    用一个单独的类去创建实例的过程,就是工厂。

    实例代码:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 
      6 namespace ConsoleApplication1
      7 {
      8     enum Operators
      9     {
     10         Add,
     11         Sub,
     12         Mul,
     13         Div
     14     }
     15 
     16     #region Opertaots
     17 
     18     class Operator
     19     {
     20         public double NumberA
     21         {
     22             get;
     23             set;
     24         }
     25 
     26         public double NumberB
     27         {
     28             get;
     29             set;
     30         }
     31 
     32         public virtual double GetResult()
     33         {
     34             double result = 0d;
     35             return result;
     36         }
     37     }
     38 
     39     class OperatorAdd: Operator
     40     {
     41         public override double GetResult()
     42         {
     43             double result = 0d;
     44             result = NumberA + NumberB;
     45 
     46             return result;
     47         }
     48     }
     49 
     50     class OperatorSub : Operator
     51     {
     52         public override double GetResult()
     53         {
     54             double result = 0d;
     55             result = NumberA - NumberB;
     56 
     57             return result;
     58         }
     59     }
     60 
     61     class OperatorMul : Operator
     62     {
     63         public override double GetResult()
     64         {
     65             double result = 0d;
     66             result = NumberA * NumberB;
     67 
     68             return result;
     69         }
     70     }
     71 
     72     class OperatorDiv : Operator
     73     {
     74         public override double GetResult()
     75         {
     76             double result = 0d;
     77             if (NumberB == 0)
     78                 throw new Exception("divisor cannot be 0!");
     79 
     80             result = NumberA / NumberB;
     81 
     82             return result;
     83         }
     84     }
     85 
     86     #endregion
     87 
     88     #region Operators Factory
     89 
     90     class OperatorFactory
     91     {
     92         public static Operator CreateOperator(Operators ope)
     93         {
     94             Operator myOperator = null;
     95 
     96             switch (ope)
     97             {
     98                 case Operators.Add:
     99                     myOperator = new OperatorAdd();
    100                     break;
    101                 case Operators.Sub:
    102                     myOperator = new OperatorSub();
    103                     break;
    104                 case Operators.Mul:
    105                     myOperator = new OperatorMul();
    106                     break;
    107                 case Operators.Div:
    108                     myOperator = new OperatorDiv();
    109                     break;
    110             }
    111 
    112             return myOperator;
    113         }
    114     }
    115 
    116     #endregion
    117 
    118     class Program
    119     {
    120         static void Main(string[] args)
    121         {
    122             Operator ope = OperatorFactory.CreateOperator(Operators.Add);
    123             ope.NumberA = 5.25;
    124             ope.NumberB = 3.69;
    125 
    126             double result = ope.GetResult();
    127 
    128             Console.ReadLine();
    129         }
    130     }
    131 }

    以上实例中:基类Operator,可以在Code中直接实例化此类,设置两个操作数,但是并不知道它是具体哪个操作符,调用GetResult方法始终获取到0,并不是最优的Class设计。

    优化后的简单工厂模式Code:将基类标记为抽象类,不能直接实例化。

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 
      6 namespace ConsoleApplication1
      7 {
      8     enum Operators
      9     {
     10         Add,
     11         Sub,
     12         Mul,
     13         Div
     14     }
     15 
     16     #region Opertaots
     17 
     18     abstract class Operator
     19     {
     20         public double NumberA
     21         {
     22             get;
     23             set;
     24         }
     25 
     26         public double NumberB
     27         {
     28             get;
     29             set;
     30         }
     31 
     32         public abstract double GetResult();
     33     }
     34 
     35     class OperatorAdd: Operator
     36     {
     37         public override double GetResult()
     38         {
     39             double result = 0d;
     40             result = NumberA + NumberB;
     41 
     42             return result;
     43         }
     44     }
     45 
     46     class OperatorSub : Operator
     47     {
     48         public override double GetResult()
     49         {
     50             double result = 0d;
     51             result = NumberA - NumberB;
     52 
     53             return result;
     54         }
     55     }
     56 
     57     class OperatorMul : Operator
     58     {
     59         public override double GetResult()
     60         {
     61             double result = 0d;
     62             result = NumberA * NumberB;
     63 
     64             return result;
     65         }
     66     }
     67 
     68     class OperatorDiv : Operator
     69     {
     70         public override double GetResult()
     71         {
     72             double result = 0d;
     73             if (NumberB == 0)
     74                 throw new Exception("divisor cannot be 0!");
     75 
     76             result = NumberA / NumberB;
     77 
     78             return result;
     79         }
     80     }
     81 
     82     #endregion
     83 
     84     #region Operators Factory
     85 
     86     class OperatorFactory
     87     {
     88         public static Operator CreateOperator(Operators ope)
     89         {
     90             Operator myOperator = null;
     91 
     92             switch (ope)
     93             {
     94                 case Operators.Add:
     95                     myOperator = new OperatorAdd();
     96                     break;
     97                 case Operators.Sub:
     98                     myOperator = new OperatorSub();
     99                     break;
    100                 case Operators.Mul:
    101                     myOperator = new OperatorMul();
    102                     break;
    103                 case Operators.Div:
    104                     myOperator = new OperatorDiv();
    105                     break;
    106             }
    107 
    108             return myOperator;
    109         }
    110     }
    111 
    112     #endregion
    113 
    114     class Program
    115     {
    116         static void Main(string[] args)
    117         {
    118             Operator ope = OperatorFactory.CreateOperator(Operators.Add);
    119             ope.NumberA = 5.25;
    120             ope.NumberB = 3.69;
    121 
    122             double result = ope.GetResult();
    123 
    124             Console.ReadLine();
    125         }
    126     }
    127 }

    UML类图:

    :矩形框表示。
    第一行为类名,如果为抽象类,类名用斜体表示;
    第二行为特性,就是字段和属性;
    第三行为操作,通常是方法和行为,+表示 public,- 表示private, #表示protected;

    接口:矩形框表示,和类图的区别主要是顶端有<<interface>>显示。
    第一行为接口名称;
    第二行为接口方法;
    接口的另一种表示,棒棒糖表示法。顶端有个类似棒棒糖的形状,棒棒糖旁边是接口名称。

     

    继承用三角形+实线表示,实现接口用三角形+虚线表示。

    关联关系(Association):用实线+箭头表示。

    聚合关系(Aggregation):表示一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分,用空心菱形+实线箭头表示。

    组合(合成)Composite:是一种强拥有关系,体现的是严格的部分和整体的关系,部分和整体的声明周期一样,用实心菱形+实线箭头表示。

     关联,聚合,合成关系都可以有基数。

    依赖关系(Dependency):虚线箭头表示。

  • 相关阅读:
    python3从尾到头打印链表
    替换空格
    二维数组中的查找
    堪比福尔摩斯的破案新科技!快来了解一下
    好莱坞首部全亚裔主演电影上映,华人终于谈恋爱了
    《呼啸山庄》:爱之深,恨之切,死相依
    《碟中谍 6:全面瓦解》口碑爆棚,登顶北美周末票房
    让重刑犯做瑜伽:新西兰人性化监狱的故事
    python面试笔试题汇总
    centos7 重置root 密码
  • 原文地址:https://www.cnblogs.com/zzunstu/p/9287625.html
Copyright © 2020-2023  润新知