单例和静态实用程序类

哪些因素影响适当的设计模式?

澄清:

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

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

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

public static final END_OF_SEQUENCE_MARKER=new EndMarker(); 

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

编辑

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

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

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

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

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

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

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

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

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