写在前面的
学习完设计模式也有很长一段时间了,在这段时间中随着自己经验的一些积累,对于之前似懂非懂的设计模式有了一些新的看法,就决定把之前所学的重新再整理一遍,帮助自己再进行一次提高,就从简单工厂模式重新开始我自己的设计模式之旅。
本系列参考资料《大话设计模式》程杰 著
简单工厂
概念
首先,我们需要明白一个概念,所有的设计模式都遵循高内聚,低耦合的原则,让所写的代码符合OOP的规范,从而达到开放–封闭的标准。
接下来我们来谈一谈简单工厂。“工厂”顾名思义就是生产东西的地方,你给予了工厂一些原材料,那么“工厂”就会按照内部的一些“方法”来把这些原料加工出来,给你想要的东西。下面我们看一下简单工厂的UML图例:
具体实例
- 我们以计算器为设计实例
首先, 我们需要编写的是运算类,按照UML图的关系,这个运算类应该属于“父类”,代码如下:
Public class Operation
{
//由于编写习惯,一般私有变量都会在前面加上下划线
private double _numA=0;
private double _numB=0;
public double NumberA
{
get;set;
//低版本的VS不能识别这样的写法
}
public double NumberB
{
get;set;
}
public virtual double GetResult()
{
//virtual 表示该父类的方法可以被重写
double result=0;//初始化方法
return result;
}
}
然后,再编写具体的运算类,按照UML图的关系,其应属于“子类”,代码如下:
class OperationAdd : Operation //加法
{
public override double GetResult()
{
//重写方法
double result = 0;//初始化参数
result=NumberA+NumberB
return result;
}
}
class OperationSub : Operation //减法
{
public override double GetResult()
{
//重写方法
double result = 0;//初始化参数
result=NumberA-NumberB
return result;
}
}
class OperationMul : 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("除数不能为零!")
result=NumberA/NumberB
return result;
}
}
- 最后,我们编写简单工厂类,然后创造出加工方法,方便终端使用,代码如下:
public class OperationFactory
{
public static Operation createOperate(string operate)
{
//根据UML图,需要在简单工厂类中使用刚才的运算类
Operation oper=null; //初始化运算类
switch (operate) //输入形参,也就是运算符号
{
//根据输入的符号不同,实例化不同的运算
//也就是根据装入的原料不同,简单工厂提供了不同的加工方法
case"+":
oper=new OperationAdd();
break;
case"-":
oper=new OperationSub();
break;
case"*"
oper=new OperationMul();
break;
case"/"
oper=new OperationDiv();
break;
}
return oper;
}
}
- 接下来,我们来建立终端代码,也就是原料的装入口,代码如下:
static void Main(string[] args)
{
Operation oper;
oper= OperationFactory.creatOperate("/");
//实例化并让工厂根据录入的参数选择加工方法
oper.NumberA=5;
oper.NumberB=9;
double result=oper.GetResult();
}
总结
和文章开头所讲的一样,简单工厂只是OOP的一个非常明了的缩影,这个小例子非常好的阐述了解耦合的思想,如果我们需要再添加一些新的运算符号时,就不用对整个代码“大刀阔斧”,只需要对有限的几个工具类进行修改就好了
看完所有的代码和UML图,我觉得自己对于这一次的回顾首先有了很大的感悟,因为没有了当初的晦涩,接下来就剩下融会贯通了。
TO BE CONTINUE……