定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
这是标准工厂方法的类图。
下面我们来列举一个比较实用的通用模板。
抽象产品类
public abstract class Product {
//产品类的公共方法
public void method1(){
//业务逻辑处理
}
//抽象方法
public abstract void method2();
}
具体产品类
public class ConcreteProduct1 extends Product {
@Override
public void method2() {
//业务逻辑处理
}
}
public class ConcreteProduct2 extends Product {
@Override
public void method2() {
//业务逻辑处理
}
}
抽象工厂类
public abstract class Creator {
/**
*创建一个产品对象,其输入参数类型可以自行设置
* 通常为String, Enum, Class等,当然也可以为空
*/
public abstract <T extends Product> T createProduct(Class<T> c);
}
具体工厂类
public class ConcreteCreator extends Creator {
@Override
public <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)product;
}
}
这里通过java反射创建实例,最后是场景类
public class Client {
public static void main(String[] args) {
ConcreteCreator concreteCreator = new ConcreteCreator();
Product product = concreteCreator.createProduct(ConcreteProduct1.class);
//业务处理...
}
}
以上代码是工厂方法的典型实现,工厂方法模式是典型的解耦框架,在本质上,工厂方法是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要谨慎的考虑是否需要增加一个工厂类进行管理,增加代码的复杂度。