工厂方法模式
一、工厂模式介绍
1、定义与类型
定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,即工厂方法让类的实例化推迟到子类中进行。
类型:创建型
2、使用场景
创建对象需要大量重复的代码
客户端(应用层)不依赖于产品类示例如何被创建、实现等细节
一个类通过其子类来指定创建哪个对象
3、优点
用户只需要关心所需产品对应的工厂,无须关心创建细节
加入新产品符合开闭原则,提高可扩展性
4、缺点
类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度
二、 代码示例
抽象产品类:
public abstract class Video { public abstract void produce(); }
实现产品类1:
public class PythonVideo extends Video { @Override public void produce() { System.out.println("录制Python课程视频"); } }
实现产品类2:
public class JavaVideo extends Video { @Override public void produce() { System.out.println("录制Java课程视频"); } }
实现产品类3:
public class FEVideo extends Video{ @Override public void produce() { System.out.println("录制FE课程视频"); } }
抽象工厂类:
public abstract class VideoFactory { public abstract Video getVideo(); }
实现工厂类1:
public class JavaVideoFactory extends VideoFactory { @Override public Video getVideo() { return new JavaVideo(); } }
实现工厂类2:
public class PythonVideoFactory extends VideoFactory { @Override public Video getVideo() { return new PythonVideo(); } }
实现工厂类3:
public class FEVideoFactory extends VideoFactory{ @Override public Video getVideo() { return new FEVideo(); } }
测试类:
public class Test { public static void main(String[] args) { VideoFactory videoFactory = new PythonVideoFactory(); VideoFactory videoFactory2 = new JavaVideoFactory(); VideoFactory videoFactory3 = new FEVideoFactory(); Video video = videoFactory.getVideo(); video.produce(); } }
类图:
三、 源码示例
1、JDK中的集合类
父类定义:
子类实现,并返回特定的“产品类”: