工厂方法模式

263 阅读1分钟

概念

定义创建对象的接口(内含工厂方法),让子类决定实例化哪个类。主要用来封装new创建方式,使用接口返回一个特别复杂的对象。缺点是每增加一个产品都要编写新产品类会导致类结构复杂化,所以简单情况时可考虑不用。

实现方式

  • Product 抽象产品类
  • ProductA 具体产品类
  • Factory 抽象工厂类
  • FactoryA 具体工厂类

1 多工厂模式

public abstract class Product{
    public abstract void method();
}

public class ProductA extends Product{
    @Override
    public void method(){
        //do something
    }
}

public abstract class Factory{
    public abstract Product createProduct();
}

public class FactoryA extends Factory {
    @Override
    public Product createProduct(){
        return new ProductA();
    }
}

//客户端
Factory f = new FactoryA();
Product p = f.createProduct();
p.method();

利用反射简化:不需为每个产品都创建一个工厂类,只需传入一个产品类的Class类即可。

public abstract class Factory{
    public abstract <T extends Product> T createProduct(Class<T> clz);
}

public class ConcreteFactory extends Factory {
    @Override
    public <T extends Product> T createProduct(Class<T> clz){
        Product p = null;
        try{
            p = (Product) Class.forName(clz.getName()).newInstance();
        } catcch (Exception e){
            e.printStackTrace();
        }
        return (T)p;
    }
}

2 静态工厂模式(简单工厂模式):当工厂只有一个的时候,可以简化掉抽象工厂,直接提供一个具体工厂并且工厂方法改为静态的即可。

public class Factory{
    public static Product createProduct(){
        return new ProductA()
    }
}