如何在整个应用程序中维护集中式对象

时间:2013-07-26 05:50:07

标签: java design-patterns

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

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

我们可以实现任何设计模式吗?

2 个答案:

答案 0 :(得分:6)

singleton design pattern工作 - 但不是非常干净;你最终得到了全局静态,很难跟踪和难以测试。这些天它通常被认为是一种反模式。有一些非常的情况仍然有意义,但我尽量避免它。

更好的方法是使用dependency injection:使每个需要其中一个对象的类声明该类型的构造函数参数(或者可能具有可设置的属性)。每个类都不应过多关注对象的共享或其他方式(除了意识到可以共享)。然后由初始化应用程序的代码决定应该共享哪些对象。

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

答案 1 :(得分:3)

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

但这不是最好的选择。

  

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

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

优于Singleton Pattern是一个应用程序范围的单个实例

为应用程序创建单个对象,并使用某个上下文对象共享它。有关详细信息,请参阅Misko in his guide to testable code

  

单个实例而不是单例模式

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

  

为什么单身人士难以测试?

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