《设计模式》学习笔记之一——简单工厂模式
最近在学《大话设计模式》,这本书确实不错,语言很通俗易懂,特别适用于我们初学者。看了这本书之后才发现原来我在编写软件的时候存在很多的不规范,回想起去年参加信息安全竞赛时,我们编写的软件因为导师的一个小小的不满意,我们只好牺牲几个晚上的休息时间,没办法把软件几乎重新写了一遍。更让人头疼的是,刚把这个问题解决了,导师又提出新的问题。那个过程可真是要命啊!而且离提交软件作品的时间也快近了,整个暑假我们浪费了很多时间在这些无用功上面。现在读到这本书,才让我从本质上认识到了这个问题,那就是:当初最早我们在设计软件时还是用计算机的逻辑思维设计,根本没有考虑到封装、继承、多态、重构等。所以每次都因为更改一个小的地方都要把整个软件几乎重写一次,这样的工作量可想而知,而且更让人感到悲哀的是,这些代码根本不能重用,也就只能用在这个软件上面,以后也面临着维护的问题。
好了,说了那么多。现在讲讲我学到的第一个模式——简单工厂模式,供像我一样的初学者们分享。
借助简单工厂模式的思想,我自己写了一个Windows桌面程序的计算器:
首先定义一个抽象类:
class Operation
{
//字段,参加运算的两个数
private double numberA;
private double numberB;
// private double result;
//属性
public double NumberA
{
get { return numberA; }
set { numberA = value; }
}
public double NumberB
{
get { return numberB; }
set { numberB = value; }
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
{
//字段,参加运算的两个数
private double numberA;
private double numberB;
// private double result;
//属性
public double NumberA
{
get { return numberA; }
set { numberA = value; }
}
public double NumberB
{
get { return numberB; }
set { numberB = value; }
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
然后其他的具有运算类可以继承该类,并且通过重写GetResult()方法来实现具体的运算操作。以加法类为例:
class operationAdd:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
最后在定义一个类工厂(OperationFactory)来实现实例化:
class OperationFactory
{
public static Operation CreatOperation( string op)
{
Operation operation=null ;
switch (op)
{
case "+":
operation = new operationAdd();
break;
case "-":
operation = new operationSub();
break;
case "*":
operation = new operationMult();
break;
case "/":
operation = new operationDiv();
break;
}
return operation;
}
}
{
public static Operation CreatOperation( string op)
{
Operation operation=null ;
switch (op)
{
case "+":
operation = new operationAdd();
break;
case "-":
operation = new operationSub();
break;
case "*":
operation = new operationMult();
break;
case "/":
operation = new operationDiv();
break;
}
return operation;
}
}
好了计算器的基本类已经定义好了,也许你现在还看不出这样写代码有什么好处,但是等你用你以前的那种计算机逻辑思维来写的话也可以实现。这样通过类封住和继承的好处是计算器便于扩展,而且等有了新的算法可以继续写一个继承Operation的类就行了,
下面给出下载:/Files/LoveHong/DTest.zip