工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。
为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如:
A a = new A ();
工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
我们以类Sample为例, 如果我们要创建Sample的实例对象:
Sample sample=new Sample();
可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等。
首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成:
Sample sample=new Sample(参数);
但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码就很难看了,需要重构(Refactor)。
所以我们应该考虑用工厂方法模式,其结构图如下:
我们假定一个工厂接口Factory要生产一种产品,我们还在计划阶段,不知道产品的细节,所以也给它一个抽象接口Product。完成计划后,我们开始考虑实施了,这时我们已经了解了产品和生产的具体详细情况,我们就有了两个具体类ConcreteFactory和ConcreteProduct。ConcreteFactory的operation方法负责具体生产情况。源代码如下:
/**
* Factory interface
*
* @version 0.00
* @author Barret_Qin
*/
public interface Factory {
Product factoryMethod();
}
/**
* Concrete factory
*
* @version 0.00
* @author Barret_Qin
*/
public interface ConcreteFactory {
public Product factoryMethod() {
return new ConcreteProduct();
}
}
/**
* Product interface
*
* @version 0.00
* @author Barret_Qin
*/
public interface Product {
void operation();
}
/**
* Concrete product
*
* @version 0.00
* @author Barret_Qin
*/
public class ConcreteProduct implements Product {
/*
* @see pattern.creational.factoryMethod.Product#operation()
*/
public void operation() {
System.out.println("I am from the operation of ConcreteProduct");
}
}
/**
* Test class
*
* @version 0.00
* @author Barret_Qin
*/
public class Tester {
/**
* @param args
*/
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.factoryMethod();
product.operation();
}
}
我们用Tester类进行测试,其输出结果应如下所示:
I am from the operation of ConcreteProduct
正如Tester类所示的那样,我们要得到产品Product,只需要调用Factory的factoryMethod方法,而不必关心其具体实现细节。另外,即使该工厂转型,开始生产其他产品,我们的客户端也不需要任何修改。