定义:
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
通用表示:
code
工厂方法模式的拓展
- 缩小为简单工厂模式:如果一个模块仅需要一个工厂类,没有必要把他生产出来,使用静态方法就可以了,根据这一要求,去除抽象类使用静态方法创建相关的对象即可,做出如下简化:
public class ConcreteFactory {
public <T extends Product> T static createProduct(Class<T> c) {
// TODO Auto-generated method stub
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
// 异常处理
}
return (T) product;
}
}
- 升级为多个工厂类,复杂的应用中一般采用多工厂的方法,然后再增加一个协调类,避免调用者和各个子工厂交流,协调类的作用是封装子工厂类,对高层模块提供统一的访问接口。
public abstract class AbstractFactory {
public abstract Human createHuman();
}
public class BlackHumanFactory extends AbstractFactory{
@Override
public Human createHuman() {
// TODO Auto-generated method stub
return new BlackHuman();
}
}
public class SingleInstance {
// 私有化构造函数
private SingleInstance() {
};
public void doSomething() {
// 相关业务处理
}
}
public class SingleInstanceFactory {
private static SingleInstance singleInstance;
static {
try {
Class clazz = Class.forName(SingleInstance.class.getName());
Constructor constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
singleInstance =(SingleInstance)constructor.newInstance();
} catch (Exception e) {
// 异常处理
}
}
public static SingleInstance getSingleInstance(){
return singleInstance;
}
}
- 延迟加载模式:一个对象被消费完毕后,并不立刻释放,工厂类保持其初始状态,等待再次被使用。
//创建延迟加载的工厂类
public class ProductDelayDemo {
// 创建一个静态变量存储已有的数据
private static final Map<String, Product> prMap = new HashMap();
public static synchronized Product createProduct(String type) throws Exception {
Product product = null;
if (prMap.containsKey(type)) {
product = prMap.get(type);
} else {
if (type.equals("ProductOne")) {
product = new ProductOne();
} else {
product = new ProductTwo();
}
}
return product;
}
}