单例模式是有状态的吗?

5

嗨,我在一份面试题目中看到了这个问题。

单例模式和原型模式(非单例模式),哪一个是有状态的,哪一个是无状态的?

我不确定原型模式是否是无状态的?这个问题有什么问题吗?


请参见:http://stackoverflow.com/questions/1989149/spring-wiring-singleton-versus-prototype - user166390
3
一个单例肯定不是无状态的。 - Hot Licks
4
有状态(stateful)和无状态(stateless)的概念与单例(singleton)和非单例(在Spring的上下文中是原型(prototype))的概念完全没有关联。 - DwB
7个回答

6
这个问题本身用词不当。无论是在单例还是原型(实例)中,都可以有状态,虽然这是合法的代码,但不必在任一情况下都需要状态。既然提到了Spring,我将尝试就使用Spring时回答这个问题。
关于Spring bean范围,singleton将导致ApplicationContext创建一个单一实例,并在请求该bean的任何地方都使用该实例。prototype将导致ApplicationContext每次请求该bean时都创建一个新实例。
两者都可以是有状态的,这是可以的。

10
如果在单例模式中没有保留状态,那么单例模式的目的是什么? - corsiKa
1
static 不够面向对象 ;) - user395760
@nicholas 嘿,这没什么大不了的。我还是认为它值得点赞。此外,无论什么时候,“对不起,我需要更多的咖啡”都是一个可行的借口! :-) - corsiKa
1
该模式本身没有状态。实现它的类可能具有状态。 - Yurii Hohan

5
如果您将“无状态”解读为“没有与特定客户端对话相关的状态”,即与特定客户端对话相关的状态,则此问题似乎非常合法(尽管措辞不佳)。
在这些条件下,单例作用域bean通常是无状态的,因为它们由多个客户端同时使用,并且它们的状态不是客户端特定的。
相反,原型作用域bean通常是在与特定客户端的对话上下文中创建的(虽然有时请求和会话范围可能更合适),因此它们的状态与那些对话相关(因为如果您的bean不需要保留任何对话状态,则可以将其设置为单例)。从这个意义上说,原型bean是有状态的。

5

原型(Prototype)Bean和单例(Singleton)Bean都可以保存状态。但是,根据Spring文档的说法,“对于所有有状态的Bean,应该使用原型范围,而对于无状态的Bean,则应使用单例范围。”


0

无状态bean:单例bean,仅初始化一次。它们唯一的状态是共享状态。这些bean在ApplicationContext初始化时创建。在此ApplicationContext的生命周期内,将返回/注入相同的bean实例。

有状态bean:可以携带状态(实例变量)的bean。每次需要对象时都会创建它们。


0

单例模式不是数据对象,将其视为数据包装器和访问点方法。

单例模式可能会被销毁,但是其所存储的状态会被独立地保存并在单例模式重新创建后呈现出来(安卓向您问好,销毁的单例模式是臭名昭著的陷阱)。


0
一个更好的问题可能是“单例模式是否线程安全?”
如果它所包含的状态是只读和不可变的,那么它就是完全线程安全的。但如果它是可变的,你必须更加小心。如果是这样,它可能会成为你的应用程序的瓶颈。必须同步共享的可写状态。

-2

无状态单例模式基本上是一组静态方法;它与静态工具类没有什么区别,而且实例的数量并不重要:0、1、2或无限。

因此,单例通常是有状态的。

(这就是为什么争论在枚举中实现单例模式是否自动解决序列化问题是毫无意义的原因。如果单例是无状态的,则该论点是无意义的;如果单例是有状态的,则该论点是错误的)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接