2012-10-07 55 views
5

可能重复:
Difference between static class and singleton pattern?辛格尔顿V/S类

为什么人会要求有且只有一个实例?使用具有静态成员变量和静态方法的类可以实现相同的目的。

至于我能找到,可能有两个可能的答案是 -

  1. 当你的类需要有状态,你只需要一个它的对象。从设计角度来看,静态方法类&变量被认为是效用类,不应该保持任何状态。

  2. 如果您的类需要参与多态性,并且只需要继承树中的类的一个对象。

这将是非常有益的,如果有人可以提供从真实的生活场景或从任何Java API,其中辛格尔顿对象需要参加多态性/继承的例子吗?

+0

与数据库连接是Singleton最常见的例子之一。你需要一个连接。 – pidabrow

回答

2

Collections.emptySet()是一个典型的单例不能实现为静态类的例子,因为很明显,它的目标是成为java.util.Set接口的一个实例。创建并不昂贵,但是每次需要空集时创建一个新实例会很愚蠢,因为唯一实例可以被重用。

1

对数据库执行日志记录或公共访问的类通常遵循单例模式。基本上任何应该有实例方法的东西都是昂贵的。

0

我的答案很短,但它足以使用完全通用的单例,而不是它的静态实现。答案是:

  • 流行范式(是的,它是!)
  • 线程(同步等)
  • 接口实现(你的静态类有一些限制)
0

范围和行为不同的担忧,不应混合。您可能希望您的对象在每次使用,每个线程,每个Web请求,每个会话或全局(Singleton)都可用。进行这些调整的原因可能是由于资源管理和最终的表现。如果你改变它的范围,你的类中的行为不应该改变。

单身人士是一种模式,只需要一点点螺栓代码即可获取一个常规对象并控制其范围。理想情况下,你真的不应该真正处理你的对象内的范围,并将其委托给工厂或容器。