单例和静态实用程序类

时间:2011-04-07 14:40:52

标签: java design-patterns

哪些因素会影响使用的设计模式?

澄清:

我问这个问题的原因是因为我正在设计一个需要多个静态工厂类和单例管理器类的应用程序。有时候,我会对我应该雇用哪种设计感到困惑,我想要问这个社区为什么可能有助于为我澄清一些事情。

4 个答案:

答案 0 :(得分:15)

当需要实例化单个对象并且所有请求的对象访问都通过此特定实例时,使用Singleton。如果需要,该对象可以保持状态。

如果您的类只是无状态实用程序函数,则使用静态实用程序..它不维护状态。永远不会实例化对象的实例。

答案 1 :(得分:7)

我为共享函数使用静态实用程序类,这些函数将从许多不同的上下文中调用 - 例如数学函数类似于java.util.Math中的函数。这是一个合适的模式,假设这些是“纯”函数(即不操纵任何状态或访问除给定参数以外的任何数据)。

我很少使用单身人士,特别是尽量避免全球单身人士。他们遭受与全局变量相关的所有常见问题。它们使测试变得困难,除非你的单例也是不可变的,否则会引入全局状态问题。我发现它们有用的主要地方是依赖于对象身份的性能黑客 - 例如:

  public static final END_OF_SEQUENCE_MARKER=new EndMarker();

然后在遍历序列时,您可以测试if(object == END_OF_SEQUENCE_MARKER)。因为它是一个静态的最终参考,JIT会把它变成一个非常快速的测试......

修改

刚刚看到你的澄清,一些快速的额外评论:

  • 静态工厂类通常没有意义。工厂类的重点是可以实例化它(或子类!),对工厂对象进行一些配置更改,然后根据您需要的配置使用它来生成对象实例。如果您要将其设置为静态,您可能只需创建一个静态MyObject.create(..)方法,而不是拥有一个完整的静态MyObjectFactory类....
  • 同样,为什么要有一个单独的单身经理班?通常,管理单例的最佳类是单例类本身,因为您通常需要它来访问私有构造函数,假设您要保证只创建一个实例。只需要一个简单的静态MySingleton.getInstance()方法就能完成你需要的所有工作。

答案 2 :(得分:2)

IMO静态实用程序类确定了调用者和类之间的具体契约。这与单身人士不同,在单身人士中你可以改变幕后的实现,使你所谓的“单身”提供者每次调用getInstance时都会分发一个新实例。

所以是的,基本上使用静态实用程序方法(例如Math)当你认为单个实例暂时足够好但你可能永远不需要实例并使用单例时未来的变化(例如连接提供商)。

答案 3 :(得分:1)

我不确定这里的问题是什么。

单例模式用于实例具有可以在多个调用中保留或更改的状态 - 这可能是连接池或类提供访问的其他共享对象。

静态实用程序类用于每个单独的方法都是无状态的,并且与该类提供的其他方法无关。