1

我正在开发一个应用程序,我需要在其中创建一个对象,并且多个类必须访问和修改该对象。如何查看其他类对象最近所做的更改以及如何通过所有类集中访问该对象而不将该对象作为参数传递给所有类?

我正在创建一个 Apache POI 文档,在其中添加多个表、多个页眉/页脚和段落。我只希望我的应用程序中存在一个XWPFDocument对象。

有没有我们可以实现的设计模式?

4

2 回答 2

6

好吧,单例设计模式可以工作——但不是很干净;您最终会得到难以跟踪和测试的全局静态状态。如今,它通常被认为是一种反模式。在少数情况下它仍然有意义,但我尽量避免它。

更好的方法是使用依赖注入:使每个需要这些对象之一的类声明该类型的构造函数参数(或可能具有可设置的属性)。每个类都不应该太关心对象的共享方式或其他方式(除了知道它可以共享之外)。然后由初始化应用程序的代码来决定应该共享哪些对象。

有多种可用于 Java 的依赖注入框架,包括GuiceSpring。这些框架的想法是在适当的配置下自动连接应用程序中的所有依赖项。

于 2013-07-26T05:54:21.440 回答
3

有一个单例模式,它为应用程序创建一个实例,并且无需传递即可共享。

但这不是最好的选择。

为什么这是一个糟糕的选择?

  • 不利于代码的可测试性
  • 设计上不可扩展

比单例模式更好的是应用程序范围的单实例

为应用程序创建一个对象并使用一些上下文对象共享它。Misko 在他的可测试代码指南中对此进行了详细解释

单实例而不是单例模式

它代表应用程序范围的单个实例,它 不会通过静态实例字段来强制其单一性。

为什么单例很难测试?

  • 静态访问防止与另一个类的子类或包装版本协作。通过硬编码依赖关系,我们失去了多态性的力量和灵活性。- 每个使用全局状态的测试都需要它以预期的状态开始,否则测试将失败。但是另一个对象可能在之前的测试中改变了该全局状态。
  • 全局状态通常会阻止测试能够并行运行,这会迫使测试套件运行得更慢。
  • 如果您添加一个新测试(它不会清理全局状态)并且它在套件中间运行,那么在它之后运行的另一个测试可能会失败。
  • 执行自己的“单身”的单身人士最终会作弊。您经常会在所谓的单例中看到 mutator 方法reset()setForTest(…)因为您需要在测试期间更改实例。如果您在测试后忘记重置 Singleton,以后的使用将使用陈旧的底层实例,并且可能会以难以调试的方式失败。
于 2013-07-26T05:54:29.453 回答