Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单例设计模式的优势是什么_C#_Oop - Fatal编程技术网

C# 单例设计模式的优势是什么

C# 单例设计模式的优势是什么,c#,oop,C#,Oop,每个人都知道如何为单例设计模式编写代码 public class Singleton { // Private static object can access only inside the Emp class. private static Singleton instance; // Private empty constructor to restrict end use to deny creating the object. pr

每个人都知道如何为单例设计模式编写代码

public class Singleton  
{  
    // Private static object can access only inside the Emp class.  
    private static Singleton instance;  

    // Private empty constructor to restrict end use to deny creating the object.  
    private Singleton()  
    {  
    }  

    // A public property to access outside of the class to create an object.  
    public static Singleton Instance  
    {  
        get  
        {  
            if (instance == null)  
            {  
                instance = new Singleton();  
            }  
            return instance;  
        }  
    }  
}  
很明显,当我们多次创建任何类的实例时,会为每个实例分配内存,但在单例设计模式的情况下,单个实例会为所有调用提供服务

1) 我有点困惑,真的不知道是什么原因…当一个人应该去单件设计模式。只是为了节省一些内存或任何其他好处

2) 假设任何一个程序都可以有许多类,那么哪些类应该遵循单例设计模式?单例设计模式的优势是什么

3在现实生活中的应用程序中,什么时候应该按照单例设计模式制作任何类? 谢谢

这是线程安全的单例
通常,在OOP中,singleton被认为是一种反模式,因为它意味着一个类断言,对于整个程序(在OOP中它不应该知道),它知道它将是唯一的一个。也就是说,根据我的经验,单例是实现常量的正确方法。一般来说,如果我将要硬编码到程序中(比如数据库用户名),那么它可以被移动到配置文件或单例


Java击败C#(在我看来…)的几个领域之一是它对枚举的支持。Java通过枚举提供了真正的OO常量,因此我将始终使用Java实现单例。C#没有现成的等价物。

以确保每次只使用一个相同的对象实例

以一个场景为例,例如对于一个公司应用程序,只有一个CEO。如果要创建或访问CEO对象,每次都应返回相同的CEO对象


另外,在登录到应用程序后,当前用户每次都必须返回相同的对象。

单例模式的好处:

•实例控制:Singleton防止其他对象实例化自己的Singleton对象副本,确保所有对象都访问单个实例

•灵活性:由于类控制实例化过程,因此类具有更改实例化过程的灵活性


与全局变量相比,Singleton的优点在于,当您使用Singleton时,您完全可以确定实例的数量,并且,您可以改变主意并管理任意数量的实例。

使用Singleton的一个有用的地方是,如果它正在访问您只想拥有单个访问点的资源。例如,我在编写与设备对话的代码时使用了它。我只需要一段与设备对话的代码,所以我使用单例。任何试图创建与设备对话的对象的另一个实例的尝试都只会返回同一个对象,因此我不必担心两个实例会维护设备的不同步数据,或使设备之间的消息混淆或混乱


但是,当然,你没有义务使用它们。它们只是一个有时有用的工具。

其他答案也很好。但他们提供了这种模式的行为特征的例子。但是,Singleton更多的是关于创作。因此,该模式的一个最重要的好处是它对资源友好。当您实际上不需要新对象时,您并不是在为
新对象
浪费内存


这带来了另一个好处,即避免了实例化开销。

单例设计模式的实时使用/好处。

  • 使用多线程时,管理多线程池
  • 管理SOA(面向服务的体系结构)中的“服务主机存储库”
  • 日志框架的实现
  • 在自动化测试/单元测试项目中,即编码UI项目
  • 在大型应用程序中实现缓存时
  • 用于配置设置以正确控制应用程序

  • 它可以改进JVM中处理内存的方式,如果内存使用得当,将获得更好的性能。您没有创建多个对象,而是尝试只创建一个对象,这样,垃圾收集器的工作更少,JVM堆中的内存占用也更少。

    顺便说一句,您的示例不是线程安全的-它是一个如何不实现singleton模式的示例,除非您真的不关心线程安全。是的,我知道它不是线程安全的。我只是想知道什么时候应该像上面那样设计他的类。单例设计模式的优点是什么?我的观点是,如果你要写“每个人都知道如何为单例设计模式编写代码”,那么展示糟糕的代码是个坏主意……是的,我的问题针对线程安全单例类设计进行了更新。Thanks我认为说“通常单例被认为是一种反模式…”有点夸张,这意味着它被认为是一种设计反模式,而不是一种设计模式。我不知道这是不是真的,但有趣的是,这是我第一次听说Singleton被称为反模式。如果这是一个广泛的考虑,即使我没有太多关注(这很可能)关于单身模式的讨论,我也会希望至少在之前听到它。@AdamPorad(6篇参考文献),链接到谷歌技术讲座。
    public sealed class MultiThreadSingleton   
    {   
        private static volatile MultiThreadSingleton instance;   
        private static object syncRoot = new Object();   
    
        private MultiThreadSingleton()   
        {   
        }   
    
        public static MultiThreadSingleton Instance   
        {   
            get   
            {   
                if (instance == null)   
                {   
                    lock (syncRoot)   
                    {   
                        if (instance == null)   
                        {   
                            instance = new MultiThreadSingleton();   
                        }   
                    }   
                } 
    
            return instance;   
            }   
        }   
    }