工作刚好一年了,现在想要提高一下自己的编码水平,能够进行系统的需求分析,以及参与项目代码的设计,特意查找了设计模式相关的文章书籍进行学习,并做下记录以备以后温习。
需求:设计一个计算器的软件,计算器有加减等计算的功能
设计思路:1、计算器的功能就是计算,但是计算的方法有很多种,所以将计算这个功能设计为接口。
2、创建加减乘除等具体的实例继承计算接口。
3、创建工厂里面根据参数创建对应的对象。
4、客户端创建工厂对象,然后调用计算方法。
代码:
功能接口
interface ICalcInterFace
{
int Calculate(int a, int b);
}
接口的具体实例:
class Subtract : ICalcInterFace
{
public int Calculate(int a, int b)
{
if (a >= b)
{
return a - b;
}
else return b - a;
}
}
class Add : ICalcInterFace
{
public int Calculate(int a,int b)
{
return a + b;
}
}
创建工厂:
enum CalcType
{
Add = 1,
Subtract = 2
}
class CalcFactory
{
public ICalcInterFace CerateCalcIntance(CalcType calcType)
{
ICalcInterFace CalcInterFace = null;
switch (calcType)
{
case CalcType.Add: CalcInterFace = new Add(); break;
case CalcType.Subtract: CalcInterFace = new Subtract(); break;
default: break;
}
return CalcInterFace;
}
}
客户端:
CalcFactory calcFactory = new CalcFactory();
ICalcInterFace add = calcFactory.CerateCalcIntance(CalcType.Add);
int result = add.Calculate(1,2);
对代码进行封装,客户端不需要知道具体的类,只需要调用公开的方法即可。但是,该设计模式扩展性不是很好,比如后面还要增加乘、除功能,那么除了需要增加乘、除的具体类之外还必须修改工厂类,违背了OCP原则----对扩展开放,对修改关闭