简单工厂模式,这是《大话设计模式》开篇讲解的内容,以一个面试题引出,步步逼近,讲的很好,详细见该书;它从最初的代码讲起,一直到最后应用到了设计模式-简单工厂模式;其中用到了类的三大特性:封装、继承、多态;在这里我不再一一讲解,只是把完整的代码贴上来供参考(稍微做了修改):
1、抽象类-Operation,该类只有一个抽象方法,负责计算各种运算,其实现由实现类完成;
public abstract class Operation {
public abstract double operate(double number1, double number2);
}
2、 接下来是各种计算类,他们继承了上面的抽象类,并根据运算实现了里面的抽象方法;
public class Add extends Operation {
@Override
public double operate(double number1, double number2) {
return number1 + number2;
}
}
public class Sub extends Operation {
@Override
public double operate(double number1, double number2) {
return number1 - number2;
}
}
public class Multip extends Operation{
@Override
public double operate(double number1, double number2) {
return number1 * number2;
}
}
public class Division extends Operation {
@Override
public double operate(double number1, double number2) {
if (number2 == 0) {
System.out.println("the second can not be zero");
return 0;
}
else return number1 / number2;
}
}
3、接下来就用到了简单工厂模式,ObjectFactory类负责创建对象,也就是根据提供的操作符决定创建哪个类对象;
public class ObjectFactory {
public static Operation getOperation(char operCharacter) {
Operation operation = null;
switch(operCharacter) {
case '+': operation = new Add();break;
case '-': operation = new Sub();break;
case '*': operation = new Multip();break;
case '/': operation = new Division();break;
}
return operation;
}
}
其实使用这样的方法来设计该面试题有很多的好处:
首先是复用性,不管是什么操作只要提供了操作符,在程序的入口调用工厂类中的方法就可以得到相应的操作对象,进而调用相应的方法计算得出结果
其次是容易扩展,如果要增加某一个运算,只需要添加一个Operation类的实现类并根据需要重写里面的抽象方法,然后再工厂类中增加一个分支即可,这其实也和面向接口编程差不多;同时避免了去修改原来的功能性代码;真可谓是一石多鸟啊!!
但是这样的简单工厂模式有没有问题呢?答案是有的,在软件开发过程中有一个非常重要的原则需要遵守:开-闭原则(open-close-rules,简称为OCR);简单的说就是对扩展开放,而不修改关闭。什么意思呢,也就是说对于开发好的软件对于扩展是非常方便的,而且尽量不去更改已经写好的功能型代码,避免了重新编译减少了工作量,这也就是对修改关闭;
再回过来看看上面写好的代码,当要增加一个运算的时候,除了增加一个类(这个是必须的)继承抽象类Operation之外,还要在工厂类中增加一个分支,这就违背了OCR;那么怎么解决呢?看下一篇文章:工厂方法