1. 定义
工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
2. 使用场景
- 复杂对象的生成,代替new的方式来屏蔽产品类的创建过程:需要一种产品,而不想知道也不需要知道工厂是如何生产出来的,只需要知道具体对应的工厂就行。
- 产品的替换需要灵活、可扩展性高的场合。
- 测试驱动开发的框架中,往往通过工厂方法把对象虚拟出来(用得比较少)。
- Android中的Bitmap就是通过工厂方法来创建的。
3. 实现
抽象产品类:
public abstract class Product {
}
具体产品类:
public class ConcreteProduct1 extends Product {
}
public class ConcreteProduct2 extends Product {
}
抽象工厂类:
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 product = null;
try {
product = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
}
场景类:
public class Client {
public static void main(String[] args) {
ConcreteFactory factory = new ConcreteFactory();
factory.createProduct(ConcreteProduct1.class);
}
}
4. 优点
- 良好的封装性与解偶。利用工厂的工厂方法类去创建具体的产品对象,隐藏了具体产品对象的创建细节,只需要关心具体产品对应的具体工厂。高层模块只需要关心抽象产品类。
- 遵守开闭原则,扩展性好。加入新的产品类时,只需要同时加入工厂类就可以实现扩展,无需修改原来的代码。
5. 缺点
- 随着产品种类的数量的增长,工厂类也会随之增加,将不利于系统的维护,增加系统编译和运行的开销。