工厂方法模式的定义:用于创建对象的接口,让子类决定实例化哪个类。
工厂方法模式的使用场景:
在需要生成复杂对象的地方都可以使用
工厂方法的UML类图:
工厂方法的简单实现:
//抽象产品及具体产品类
public abstract class Product {
abstract void method();
}
public class ProductA extends Product{
@Override
void method() {
// TODO Auto-generated method stub
System.out.println("生产了Ac产品");
}
}
public class ProductB extends Product{
@Override
void method() {
// TODO Auto-generated method stub
System.out.println("生产了B产品");
}
}
//抽象工厂及具体工厂类
public abstract class Factory {
public abstract <T extends Product> T create(Class<T> clz);
}
public class FactoryMethods extends Factory{
@Override
public <T extends Product> T create(Class<T> clz) {
// TODO Auto-generated method stub
Product p = null;
try {
//通过类对象用反射构造实例, 这里不直接使用clz.newInstance构造对象,防止出现构造失败出现错误
//p = (Product) Class.forName(clz.getName()).newInstance();
p = clz.newInstance();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T)p;
}
}
//测试用例
public class testForFactoryMethods {
public static void main(String[] args) {
Factory f = new FactoryMethods();
Product p = f.create(Product.class);
p.method();
}
}
可以看到结合Java中的反射机制可以在调用工厂方法的时候指定类名去创建,可以省去大量的if-else的结构去创建对应的类型。