工厂方法
定义
- 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
- 类型:创建型。
适用场景
- 创建对象需要大量的重复代码。
- 客户端(应用层)不依赖于产品类的实例如何被创建、实现等细节。
- 一个类通过其子类来指定创建哪个对象。
优点
- 用户只需要关心所需产品对应的工厂,而无需关心创建细节。
- 加入新的产品符合开闭原则,提高可扩展性。
缺点
- 类的个数容易过多,增加复杂度。
- 增加了系统的抽象性和理解难度。
举例
工厂方法相对于简单工厂来说,将具体的创建产品的实现交给了原本工厂的一个个具体的子类,而子类只负责一族产品的创建,如果需要增加新的产品,则加上具体产品类和产品工厂类即可。
理解
JDK源码
我们先来看看这些源代码
// Collection
Iterator<E> iterator();
// ArrayList
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {...}
这里的Collection相当于抽象工厂,而ArrayList是具体的实现工厂;Iterator相当于抽象产品类,Itr相当于具体的产品类。
对照什么的例子来说的话,Collection相当于VedioFactory,ArrayList相对于FEVedioFactory;Iterator相当于Vedio,Itr相当于FEVedio。
有兴趣的小伙伴还可以看看URLStreamHandlerFactory和LoggerFactory