且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

【Java设计模式系列】工厂方法模式(上)

更新时间:2022-06-29 17:22:43

https://github.com/Wasabi1234/design-patterns

1 简介

  • 定义
    定义一个创建对象的接口。但让实现这个接口的类决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
  • 类型
    创建型

通用类图

【Java设计模式系列】工厂方法模式(上)

在工厂方法模式中:

  • 抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义
  • Creator为抽象创建类,即抽象工厂,具体如何创建产品类是由具体实现工厂ConcreteCreator完成

2 简单工厂模式的升级

【Java设计模式系列】工厂方法模式(上)

【Java设计模式系列】工厂方法模式(上)

【Java设计模式系列】工厂方法模式(上)

【Java设计模式系列】工厂方法模式(上)

【Java设计模式系列】工厂方法模式(上)

案例一

对造人过程进行分析,该过程涉及三个对象:女娲、八卦炉、三种不同肤色的人

  • 女娲可以使用场景类Client表示
  • 八卦炉类似于一个工厂,负责制造生产产品(即人类)
  • 三种不同肤色的人,他们都是同一个接口下的不同实现类,对于八卦炉来说都是它生产出的产品
  • 【Java设计模式系列】工厂方法模式(上)
  • 接口Human是对人类的总称,每个人种都至少具有两个方法
  • 【Java设计模式系列】工厂方法模式(上)
  • 黑色人种

【Java设计模式系列】工厂方法模式(上)

  • 黄色人种
  • 【Java设计模式系列】工厂方法模式(上)
  • 白色人种
  • 【Java设计模式系列】工厂方法模式(上)
  • 所有人种定义完毕,下一步就是定义一个八卦炉,然后烧制。

最可能给八卦炉下达什么样的生产命令呢?

应该是


给我生产出一个黄色人种(YellowHuman类)

而不会是


给我生产一个会走、会跑、会说话、皮肤是黄色的人种

因为这样的命令增加了交流的成本,作为一个生产的管理者,只要知道生产什么就可以了,无需事物具体信息

【Java设计模式系列】工厂方法模式(上)

通过定义泛型对createHuman的输入参数产生两层限制

  • 必须是Class类型
  • 必须是Human的实现类
    其中的T表示,只要实现了Human接口的类都可以作为参数

只有一个八卦炉,其实现生产人类的方法

【Java设计模式系列】工厂方法模式(上)

人种有了,八卦炉也有了,剩下的工作就是女娲采集黄土,然后命令八卦炉开始生产

【Java设计模式系列】工厂方法模式(上)

人种有了,八卦炉有了,负责生产的女娲也有了

运行一下,结果如下所示

【Java设计模式系列】工厂方法模式(上)