最近工作不是很忙,正好抽时间看看设计模式,园子里关于设计模式的文章已经很多了,这里就记录一下自己的学习过程了,顺便也了解一下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 }
派生类:创建 + - * / 四个具体类。重写父类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 }
抽象工厂:简单的说工厂的职责是根据需求生产不同的产品,在这里就是根据具体条件,创建不同的派生类对象。
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 }
这样基本的简单工厂就以实现,测试代码就不贴了。细想一下,以上代码还是用到了面向对象编程的继承、多态的思想的。
(ps:平时不注意这些,今天看了下面向对象的三个特性,具体点的自己还是不清楚的,难怪毕业两年了,没什么进步。)
网上查了一些资料,对简单工厂模式优缺点分析一下:
有点:根据提供的条件创建具体实例(由工厂实现),无需考虑创建实例的具体细节。
缺点:缺点就在简单工厂毕竟是个简单工厂!工厂包含了实现派生类的具体逻辑,如果派生类增加,甚至是抽象类增加,这是后就要对工厂类修改,这就违背了“开放封闭原则”。