【问题标题】:what is the advantage of Singleton Design Pattern单例设计模式的优势是什么
【发布时间】:2023-05-13 17:17:01
【问题描述】:

每个人都知道如何为 Singleton Design Pattern.say 编写代码

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 在现实生活中的应用程序中,什么时候应该按照单例设计模式创建任何类? 谢谢

这里是线程安全的单例

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;   
        }   
    }   
}

【问题讨论】:

  • 顺便说一句,您的示例不是线程安全的 - 这是一个示例,说明 not 如何实现单例模式,除非您真的不关心线程安全。
  • 是的,我知道它不是线程安全的。我只需要知道什么时候应该像上面那样设计他的课程。单例设计模式有什么优势
  • 我的意思是,如果你要写“每个人都知道如何为单例设计模式编写代码”,那么显示 bad 代码是个坏主意……
  • 是的,我的问题已针对线程安全的单例类设计进行了更新。谢谢

标签: c# oop


【解决方案1】:

保证每次只有一个相同的对象实例。

假设一个公司应用程序,只有一个 CEO。如果要创建或访问 CEO 对象,则每次都应返回相同的 CEO 对象。

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

【讨论】:

    【解决方案2】:

    其他答案也很好。但他们提供了模式的行为特征示例。但是,Singleton 更多的是关于创造。因此,该模式最重要的好处之一是资源友好。当您实际上不需要一个新的时,您并没有为 new object 浪费内存。

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

    【讨论】:

      【解决方案3】:

      单例模式的好处:

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

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

      Singleton 相对于全局变量的优势在于,您在使用 Singleton 时绝对可以确定实例的数量,并且您可以改变主意并管理任意数量的实例。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          使用单例的一个有用的地方是,如果它正在访问一些您只想拥有一个访问点的资源。例如,我在编写一些与设备对话的代码时使用过它。我只想要一段代码与设备对话,所以我使用单例。任何创建与设备对话的对象的另一个实例的尝试都只会返回相同的对象,因此我不必担心两个实例会维护有关设备的不同步数据或从设备接收和接收混合消息向上或无序。

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

          【讨论】:

            【解决方案6】:

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

            Java 击败 C# 的少数领域之一(在我看来......)是它对枚举的支持。 Java 通过枚举提供了真正的 OO 常量,所以这就是我将始终在 Java 中实现单例的方式。 C# 没有现成的等价物。

            【讨论】:

            • 我认为说“通常单例被认为是一种反模式......”这意味着它被认为是一种设计反模式而不是设计模式。我不知道这是否属实,但有趣的是,这是我第一次听说 Singleton 被称为反模式。如果这是一个广泛的考虑因素,即使我没有过多关注(很可能)关于单例模式的讨论,我也希望至少在之前就听说过。
            • @AdamPorad en.wikipedia.org/wiki/Singleton_pattern(6 个参考)、*.com/questions/11292109/…*.com/questions/1448393/… 链接谷歌技术讲座。
            【解决方案7】:

            它可以改进 JVM 中处理内存的方式,并且正确使用内存可以达到更好的性能。您不是在创建多个对象,而是尝试只创建一个对象,这样垃圾收集器的工作量就会减少,JVM 堆中的内存占用也会减少。

            【讨论】:

              【解决方案8】:

              让我们假设有一台打印机并且所有人都必须访问该打印机,然后在创建对象时,您应该只允许一个人进行打印,因为它不允许同时另一个人进行打印,这就是为什么在现实生活中的这种情况下我们需要单吨类,我们可以在其中更清晰地一一管理任务......

              【讨论】:

                最近更新 更多