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

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

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

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

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

原文地址:https://www.cnblogs.com/ashleyboy/p/4396797.html