Class.newInstance()是否遵循"抽象工厂"设计模式?

div*_*eep 10 java reflection builder java.lang.class

我已经开始阅读Joshua Bloch的"Effective Java"(第二版).在阅读第2项时(在面对许多构造函数参数时考虑构建器),有一个特定的声明,即作者使用了Class.newInstance()方法.具体来说,作者说

Java中的传统抽象工厂实现一直是"类"对象,"newInstance"方法扮演"构建"方法的一部分.

这部分让我感到困惑 - 我对抽象工厂设计模式的理解是它用来代表工厂的工厂.该Class.newInstance()方法,在我看来,边框上的"静态工厂方法"编码理念(这顺便说一句,在同一本书第1项)以上

思绪,有人吗?我一直在努力克服一些艰难的采访,如果我的基本面在出现进行此类采访之前是稳固的话,我会非常感激.

谢谢.

bet*_*ejo 6

这是我的意见。

首先,抽象工厂模式不旨在成为工厂工厂。此模式的关键方面是,存在一个具有基础(可能无法访问)工厂实现的可访问接口,您可以通过该接口获得(可能无法访问)对象实现的可访问接口。我知道,关于我如何理解Gamma的书中这种模式的某些适用条件,这是一个很讨厌的文字游戏:

  • 系统应独立于其产品的创建,组成和表示方式
  • 您想要提供产品的类库,并且只想显示它们的接口,而不是它们的实现。

最后,您得到的是对象,而不是工厂。

其次,我不会在模式概念和语言关键字之间建立1:1关系。“抽象工厂”不一定总是转换为Java abstract classinterface构造。只要您以某种方式确保客户端代码独立于基础工厂和对象实现,您仍然可以有一个常规的,可扩展的,可实例化的类来表示“抽象工厂”。的情况就是这样java.lang.Class,它既不是抽象的也不是接口,而是在隐藏通过newInstance()方法表示的类型的无参数构造函数实现方面的工作。如果像这样使用它,可能会更清楚:

Object o = Class.forName(type).newInstance();
Run Code Online (Sandbox Code Playgroud)

Class扮演“抽象工厂”,并Object扮演“抽象产品”的类型实现。

最后,newInstance()我不是静态工厂方法,因为这种模式旨在返回实现它的类的实例。newInstance()不返回Class或子对象的实例Class。它返回其表示类型的实例。正如布洛赫(Bloch)在书中所言,这也不是“工厂方法”。