大话设计模式之一简单工厂模式
这是我所敲的第一个设计模式,一个严格来说不能算作设计模式的模式,一个让我这个菜鸟头疼了两天的模式~对于刚才VB6.0转战过来的、从前认为代码简单即是优的我来说,理解这个过程真的很痛苦呢~
在这里也受到了面向对象的第一次洗礼,所有的代码都不能只顾着眼前,单纯的只为了设计出某些功能就算完事了,而需统筹兼顾,站在更高的层次如安全性、维护性、经济性上看问题。我们要尝试着去做一个设计者,而不是单纯的复制粘贴似的代码工人。
这个例子是为了实现一个简单计算器的运算功能。在其演变当中,从封装到继承再到多态,无一不在体现着可维护、可复用(可不是复制哦)、可扩展、灵活性好的特点。首先来看一下简单工厂的UML图:
再来看看代码:
Operation运算类:定义简单工厂创造的对象父类,可以是一个类、或者一个接口。
//创建父类Operation public class Operation { private double _numberA = 0; private double _numberB = 0; //NumberA属性 public double NumberA { get { return _numberA; } set { _numberA = value; } } //NumberB属性 public double NumberB { get { return _numberB; } set { _numberB = value; } } //构建运算虚方法 public virtual double GetResult() { double result = 0; return result; } }
//加法类,继承运算类(Operation) class OperationAdd:Operation { //方法重写,将父类实现替换为子类的实现 public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } //除法类 class OperationDiv : Operation { //方法重写 public override double GetResult() { double result = 0; //判断 if (NumberB == 0) throw new Exception("除数不能为0!"); else result = NumberA / NumberB; return result; } }
简单运算工厂类:simple factory的核心,含所有实例的内部逻辑,可被客户端等调用,用来创建产品所需的对象。 它可以是一个接口,也可以是一个抽象类
public class OperationFactory { //首先createOperate是一个静态方法(static),这意味着不用创建OperationFactory类的实例对象就能调用这个方法,OperationFactory.createOperate(operate); //其次这个方法的返回值类型是Operation,方法包含一个String类型的参数,public决定了这个方法是一个公共方法 public static Operation createOperate(string operate) { Operation oper = null; switch (operate) { //实例化加法类 case "+": oper = new OperationAdd(); break; break; //实例化除法类 case "/": oper = new OperationDiv(); break; } return oper; } }
客户端代码:只知道传入了工厂类的参数,对于如何创建对象(逻辑)不关心
//举例加法运算 Operation oper; oper = OperationFactory.createOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double resultAdd = oper.GetResult(); //显示运算结果 Console.WriteLine("加法运算的结果值为:{0}", resultAdd); Console.ReadLine(); //除法 oper = OperationFactory.createOperate("/"); oper.NumberA = 1; oper.NumberB =5; double resultSub = oper.GetResult(); Console.WriteLine("除法运算的结果值为:{0}",resultSub ); Console.ReadLine();
这样写完之后,各个运算类之间是独立的,耦合性大大降低。如果想要增加一个乘法运算,只要编写一个乘法类,在简单工厂模式(代码安全,没有运算过程)中增加一条case语句就行了。下面是执行结果:
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
缺点:由于简单工厂模式本身包括了所有的运算方式,每次维护或者扩展计算方法都要改动这个工厂,以致代码重新编译部署,解决方法在后续的学习当中会出现。
- 4楼liutengteng130昨天 16:18
- 加油。
- Re: wlccomeon昨天 08:07
- 回复liutengteng130n嗯嗯~
- 3楼beijiguangyong前天 13:50
- 学习了~
- Re: wlccomeon前天 13:50
- 回复beijiguangyongn呃。。。勇哥,光临寒舍真是让我蓬荜生辉啊!
- 2楼xvshu3天前 21:27
- 学习啊
- Re: wlccomeon前天 13:49
- 回复xvshun共同学习~
- 1楼wss7846161584天前 19:28
- 字体在大一点吧!感觉比较费劲!
- Re: wlccomeon4天前 08:08
- 回复wss784616158n嗯,下次注意~