一. 定义与类型
定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行
类型:创建型
二. 使用场景
创建对象需要大量重复的代码
客户端(应用层)不依赖于产品类实例如何被创建,实现等细节
一个类通过其子类来指定创建哪个类
三. 优缺点
优点:用户只需要关系所需产品对应的工厂,无需关心创建细节,加入新产品符合开闭原则,提高可扩展性
缺点:类的个数容易过多,增加复杂度,增加了系统的抽象行和理解难度
四. coding
我们还是以上一篇的简单工厂的video为例。在原来的基础上做一定的修改,符合开闭原则。
/** * @program: designModel * @description: * @author: YuKai Fan * @create: 2018-11-13 16:50 **/ public abstract class VideoFactory { public abstract Video getVideo(); }
抽象工厂类中的具体工厂对象video(这个也是抽象的,只是对于抽象工厂来说,是具体的)
/** * @program: designModel * @description: 视频类 * @author: YuKai Fan * @create: 2018-11-13 16:46 **/ public abstract class Video { public abstract void product(); }
具体的实体类,是继承video:
/** * @program: designModel * @description: java视频类 * @author: YuKai Fan * @create: 2018-11-13 16:47 **/ public class JavaVideo extends Video { public void product() { System.out.println("录制java课程视频"); } }
/** * @program: designModel * @description: Python视频类 * @author: YuKai Fan * @create: 2018-11-13 16:48 **/ public class PythonVideo extends Video { public void product() { System.out.println("录制Python课程视频"); } }
具体的工厂类,是用来创建具体的实体对象的:
/** * @program: designModel * @description: * @author: YuKai Fan * @create: 2018-11-21 11:05 **/ public class JavaVideoFactory extends VideoFactory { public Video getVideo() { return new JavaVideo(); } }
/** * @program: designModel * @description: * @author: YuKai Fan * @create: 2018-11-21 11:06 **/ public class PythonVideoFactory extends VideoFactory { public Video getVideo() { return new PythonVideo(); } }
客户端:
/** * @program: designModel * @description: * @author: YuKai Fan * @create: 2018-11-13 16:48 **/ public class Test { public static void main(String[] args) { VideoFactory videoFactory = new JavaVideoFactory(); Video video = videoFactory.getVideo(); video.product(); } }
UML类图:
五. 源码分析
jdk中的集合框架Collect中的Iterate方法就是采用抽象工厂的方式实现,还是日志矿机的logback的getLogger也是。