2011-04-07 64 views
11

什么因素影响合适的设计模式?单身和静态实用程序类

澄清:

我之所以问这个问题,是因为我设计需要多个静态工厂类和单管理类的应用程序。有时,我变得困惑,其设计我应该的员工,我想提出这个社区为什么可能有助于澄清事情对我来说一点。

+0

这非常模糊...... – 2011-04-07 14:45:41

+0

均等化,尽管您可能希望在不久的将来对您的问题进行更具描述性的描述。 :-) – 2011-04-07 14:49:41

+0

我想这是什么stackoverflow人们认为脱离主题。如果你表达你的问题的动机并展示一些真实的例子,那么答案可能更集中。否则,这可能是一个过于宽泛和主观的问题。 – 2011-04-07 14:50:31

回答

6

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

我很少使用的单身人士,特别是尽量避免全局单。他们患有与全局变量相关的所有常见问题。他们使测试变得困难,除非你的单身也不可变,否则他们会引入全局状态的问题。遍历序列时,你可以测试是否(对象== END_OF_SEQUENCE_MARKER)

public static final END_OF_SEQUENCE_MARKER=new EndMarker(); 

然后:比如 - 我发现它们非常有用的主要场所是依赖于对象标识性能黑客。因为它是一个静态的最终参考,JIT将把它变成一个非常快速的测试....

编辑

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

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

辛格尔顿时使用一个单一的对象需要被实例化,并且所有请求对象的访问经历此特定实例。如果需要,该对象可以保持状态。当你有一类就是刚无国籍实用功能..它不维护状态

静态工具被使用。该对象的一个​​实例从未实例化。

+0

你是什么意思,班级维护一个国家(什么状态)? – Mercury 2016-12-28 16:35:34

1

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

辛格尔顿模式被用在该实例具有可以保留或跨呼叫的数量改变状态 - 这可能是一个连接池或其他一些共享对象的类提供了访问。

静态工具类用于其中每个单独的方法是无状态的,并且对所述类提供了其它方法没有关系。

2

IMO静态工具类粉笔下来电者和班级之间的具体合同。这与单身人士不同,您可以在幕后更改实施方案,以便每次拨打电话getInstance时,让所谓的“单身人士”提供者发出新实例。

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