这是我所敲的第一个设计模式,一个严格来说不能算作设计模式的模式,一个让我这个菜鸟头疼了两天的模式~对于刚才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设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
缺点:由于简单工厂模式本身包括了所有的运算方式,每次维护或者扩展计算方法都要改动这个工厂,以致代码重新编译部署,解决方法在后续的学习当中会出现。