----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
所谓设计模式,我个人理解为为了更好的解决问题,解决过程中所产生的一种思维的模版。世界上本没有路,走的人多了,就有了路,无数程序员踏出的这条解决问题的路,自然有其好处,根据这条路来思考,编程,清晰明了,并且继承了一系列好处,比如可维护性,比如可扩展性。
简单工厂模式
进入正题,想要设计一个计算器,要知道的无外乎2个,数、运算法则(即运算符)。运算法则,就是我们需要封装的了,包括已有的,自定义的。数则作为参数传递。对于用户输入的运算符,是不可预知的,我们不知道需要用哪个对象来进行计算。这里就需要用到工厂,判断客户端提交的oper来生产相应的运算法则对象。
1、为了实现多态,首先来一个实现计算的接口,屏蔽掉运算法则的差异
interface ICalculate
{ object Calculate(); }
考虑到多态, 返回类型用了object
2、封装运算法则
//加法,二目运算符
class Add:ICalculate
{
int num1, num2;
public Add(int num1,int num2)
{
this.num1 = num1;
this.num2 = num2;
}
public object Calculate()
{
return num1 + num2;
}
}
//阶乘,一目运算符
class Factorial:ICalculate
{
int num;
public Factorial(int num)
{
if (num <= 0)
{
this.num=1;
}
this.num = num;
}
public object Calculate()
{
return Multi(num);
}
int Multi(int num)
{
if (num <= 0)
{
return 1;
}
return num * Multi(num - 1);
}
}
3、接下来开始工厂类的设计
class Factory
{
//生成二目运算符对象
public static ICalculate Create(string oper,int num1,int num2)
{
switch (oper)
{
case "+": return new Add(num1, num2);
case "-": return new DIf(num1, num2);
default: return null;
}
}
//生成一目运算符对象
public static ICalculate Create(string oper, int num)
{
switch (oper)
{
case "!": return new Factorial(num);
default: return null;
}
}
}
工厂类中2个方法相当于2条具体的生产线。
4、在客户端的调用
ICalculate c=Factory.Create(string oper,int num1,int num2);
if(c!=null)
{
c.Calculate();//这就是我们想要的结果了
}
浅谈我理解的抽象工厂
如果考虑到工厂的可扩展性,可以继续对工厂进行处理。
工厂都有生产的能力,于是我们可以定义一个抽象工厂,所有的具体工厂类都实现抽象工厂中定义的那些公共接口。这样做职责清晰,可以减小每一个工厂的大小,并且利于扩展和维护,但是缺点也有,由于每条生产线只能生产一种产品,每加入一个产品就必须开一个工厂。
但是就当前这个计算器项目而言,还有一个重要问题,当客户端不确定需要哪些产品(oper的不可预知性),那么我到底用哪个工厂进行生产呢?
当我们需要多个对象一起应用并且他们的约束是不可分离的时候,比如客户需要一辆车,那么就应该有一个专门造车的工厂,组装所有的工厂生产的零件,这就是抽象工厂的好处。
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------