静态工厂方法的实际用例?

我熟悉静态工厂方法的想法和好处,如Joshua Bloch的 Effective Java 中所述:

  • 工厂方法具有名称,因此与构造函数不同,您可以具有多个具有相同签名的工厂方法。
  • 工厂方法不必创建新对象;它们可以返回以前创建的对象。这适用于不可变对象或值对象。
  • 与构造函数不同,工厂方法可以返回其返回类型的任何子类型的对象。

现在,我试图为正在学习Java和OO原则的人解释静态工厂方法。她从具体的场景中而不是抽象中学习得最好。如果她能在工作中看到这种模式,解决一些问题,她就会明白。但她发现,阅读像上面这样的抽象特征列表来了解如何应用该模式是很困难的。

你能帮我举一个使用静态工厂方法的现实例子吗?这清楚地表明了它的好处,但仍然足够简单,可以在入门级Java课程中向某人展示?

这个人确实有PL / SQL的编程经验,但从未学习过OOP模式。


答案 1

使用javax.swing.BorderFactory作为所有三点的示例。

此类用于为摆动对象创建边框。这些边框对象可以很容易地重用,而此工厂方法允许这样做。这是javadoc。这个工厂是所有三点的一个很好的例子:

  • 有多个具有不同名称的静态方法,如 和 。createEmptyBorder()createEtchedBorder()
  • 这些方法将尽可能返回以前创建的对象。在整个应用程序中经常使用相同的边框。
  • Border本身实际上是一个接口,因此通过此工厂创建的所有对象实际上都是实现此接口的类。

答案 2

第二点的教科书示例是 Integer.valueOf(int) (类似于 , , , )。对于参数值 -128 到 127,此方法返回缓存的实例,而不是创建新的 。这使得(自动)装箱/取消装箱对于典型值的性能更高。BooleanShortLongByteInteger

你不能这样做,因为JLS要求每次调用它时都创建一个新实例new Integer()new