静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
当前回答
我同意这个定义:
单词“single”表示整个应用程序生命周期中的单个对象循环,因此范围在应用程序级别。静态不具有任何Object指针,因此作用域位于AppDomain级别。此外,两者都应实现为线程安全。
你可以发现其他有趣的区别:Singleton模式与静态类
其他回答
我同意这个定义:
单词“single”表示整个应用程序生命周期中的单个对象循环,因此范围在应用程序级别。静态不具有任何Object指针,因此作用域位于AppDomain级别。此外,两者都应实现为线程安全。
你可以发现其他有趣的区别:Singleton模式与静态类
静态类是一个只有静态方法的类,对于这个类,更好的词是“函数”。静态类中体现的设计风格纯粹是过程性的。
另一方面,Singleton是OO设计特有的模式。它是一个对象的实例(具有其中固有的所有可能性,例如多态性),具有一个创建过程,确保在整个生命周期中只有一个特定角色的实例。
单例只是一个被实例化的普通类,但仅从客户端代码间接实例化一次。静态类未实例化。据我所知,静态方法(静态类必须有静态方法)比非静态方法更快。
编辑:FxCop性能规则描述:“不访问实例数据或调用实例方法的方法可以标记为静态(在VB中共享)在这样做之后,编译器将向这些成员发出非虚拟调用点,这将防止在运行时对确保当前对象指针为非空的每个调用进行检查。这可以为性能敏感的代码带来可衡量的性能增益。在某些情况下,无法访问当前对象实例表示正确性问题。"我不知道这是否也适用于静态类中的静态方法。
静态类不适用于任何需要状态的对象。它对于将一堆函数放在一起非常有用,例如Math(或项目中的Utils)。所以类名只是给了我们一个线索,我们可以在哪里找到函数,而不是更多。
Singleton是我最喜欢的模式,我用它在一个点上管理一些东西。它比静态类更灵活,可以保持其状态。它可以实现接口,从其他类继承并允许继承。
我在静态和单例之间选择的规则:
如果有一堆函数应该保持在一起,那么静态就是选择。任何其他需要对某些资源进行单一访问的内容都可以作为单例实现。
在单例模式中,可以将单例创建为派生类型的实例,但不能使用静态类。
快速示例:
if( useD3D )
IRenderer::instance = new D3DRenderer
else
IRenderer::instance = new OpenGLRenderer