声明:
本博客是本人在学习《Java 设计模式精讲》后整理的笔记,旨在方便复习和回顾,并非用作商业用途。
本博客已标明出处,如有侵权请告知,马上删除。
1. 工厂方法讲解
- 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
- 类型∶创建型
- 适用场景
- 创建对象需要大量重复的代码
- 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
- 一个类通过其子类来指定创建哪个对象
- 优点
- 用户只需要关心所需产品对应的工厂,无须关心创建细节
- 加入新产品符合开闭原则,提高可扩展性
- 缺点
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
2. 工厂方法 Coding
业务场景和前一章的简单工厂一样,我们直接对简单工厂里面的代码进行改造
-
创建一个课程视频抽象类
public abstract class Video { public abstract void product(); }
-
创建两门课程视频继承它
public class JavaVideo extends Video { @Override public void product() { System.out.println("录制Java课程视频"); } }
public class PythonVideo extends Video { @Override public void product() { System.out.println("录制Python的课程视频"); } }
注意:Java 视频和 Python 视频都是同一个产品等级,工厂方法是解决产品等级的问题。相同类型的一个产品,我们称之为产品等级;而不同类型的产品,相同的生产商,我们称为产品族。产品等级和产品族是区分工厂方法和抽象方法的重要概念。
-
与简单工厂不同的是,我们的工厂类改为了一个接口。VideoFactory 只定义一个默认的契约,具体创建哪一种对象由具体的子类工厂去实现。
public interface VideoFactory { Video getVideo(); }
-
创建两门课程视频工厂实现它
public class JavaVideoFactory implements VideoFactory { @Override public Video getVideo() { return new JavaVideo(); } }
public class PythonVideoFactory implements VideoFactory { @Override public Video getVideo() { return new PythonVideo(); } }
-
测试类
public class Test { public static void main(String[] args) { VideoFactory videoFactory = new JavaVideoFactory(); Video video = videoFactory.getVideo(); video.product(); } }
运行结果:
录制Java课程视频
现在类图如下所示:
工厂方法和简单工厂对比:
- 优点:当我们需要新增产品时,只需要新增子类工厂即可,无需修改父类工厂接口,遵循了开闭原则。
- 缺点:类的个数容易过多,增加复杂度