工厂模式,应该是应用最为广泛、最为重要的设计模式,它里面包括三种:简单工厂(不包括在23种经典的模式中)、工厂方法模式以及抽象工厂模式,由前往后抽象程度越来越高。
先介绍下简单工厂。
编码过程中,我们新手经常会写这样的代码:
//other code...
//输出设备
OutPut output = null;
if(name.equals("print")){
//打印机
output = new Print();
}else if(name.equals("monitor")){
//显示器
output = new Monitor();
}
//other code ...
这种写法本身并没有什么语法错误,毕竟这是java语法基础的一部分,但问题在于可扩展性很不好,如果系统要添加一种输出设备并且上面这段代码在你系统多个类中存在,那么每个地方都需要修改,不仅麻烦而且容易出错。问题出在:系统主要业务逻辑中不需要知道你具体对象时如何初始化的,它只是使用该对象,该对象的初始化信息应该另外封装起来,这就是面向对象的封装。
我们可以将上面这段代码封装到一个单独的类中(即是工厂类),然后任何时候需要的时候直接告诉这个工厂类来取得一个产品即可。这样当需要扩展输出设备时,即使我们在很多地方调用了工厂类也没关系,我只需要修改这个封装好的工厂类即可。
简单工厂:
public interface OutPut {}
public class Print implements OutPut {}
public class Monitor implements OutPut {}
public class SimpleFactory {
public static OutPut createOutput(String name){
OutPut output = null;
if(name.equals("print")){
output = new Print();
}else if(name.equals("monitor")){
output = new Monitor();
}
return output;
}
}
当我们要消费“产品”的时候,直接告诉简单工厂我们需要一个产品,当然同时得告诉工厂类你需要的产品的名字:
OutPut output;
output = SimpleFactory.createOutput("print");
简单工厂很简单,但有不足之处,这也是为什么我们需要工厂方法模式的原因。
下一篇:工厂方法模式