概念
定义创建对象的接口(内含工厂方法),让子类决定实例化哪个类。主要用来封装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()
}
}