工厂方法把类的初始化工作封装到了一个单独的类中, 这个类被称为工厂类.
首先需要一个工厂接口和产品接口:
public interface IFactory {
IProduct create();
}
public interface IProduct {
}
接下来, 创建一个具体的产品类A:
public class ProductA implements IProduct {
}
我们希望把A实例化的工作封装成一个单独的工厂类:
public class ProductAFactory implements IFactory {
public IProduct create() {
return new ProductA();
}
}
在Nutz中, 需要要把工厂类以及工厂方法都添加注解就可以实现:
@IocBean // 注解工厂类
public class ProductAFactory implements IFactory {
@IocBean(name = "a") // 注解工厂方法
public IProduct create() {
System.out.println("called by ioc container");
return new ProductA();
}
}
这样我们就完成了一个工厂方法设计模式. 这个设计模式比较简单, 但是我们需要把它和之前的单例模式作对比, 我们首先看一下类实例化的一些方法.
new Object()
function Object getInstance(){ return new Object() }
class ObjectFactory(){ function Object getInstance( return new Object() ) }
仔细观察不难发现, 设计模式其实是一个不断封装的过程, 由语句到函数, 由函数到类, 一层层封装, 最后就是我们现在看到了工厂方法模式了.
每层封装都给我们带来了极大的灵活性, 同时又增加了复杂性, 在选择时一定要适可而止.