11

每个人都知道如何为 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;   
        }   
    }   
}
4

8 回答 8

11

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

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

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

于 2012-10-15T18:32:03.590 回答
8

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

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

于 2015-11-01T17:13:47.513 回答
4

单例模式的好处:

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

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

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

于 2012-10-15T18:32:16.590 回答
3

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

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

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

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

于 2012-10-15T18:34:11.173 回答
1

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

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

于 2012-10-15T18:29:31.000 回答
0

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

于 2019-11-24T18:05:46.680 回答
-1

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

于 2021-08-15T08:19:28.430 回答