面向对象编程思想-单例模式

单例模式的定义:只能有一个实例,提供唯一公开、可访问实例的全局访问点

单例模式的三种实现方式:

示例1

     private Singleton()
        {
            Console.WriteLine("{0}被构造,线程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
        }
private static Singleton m_Singleton = null;
    
public static Singleton CreateInstance() {
        
if (m_Singleton == null) {
          //Thread.Sleep(1000); m_Singleton
= new Singleton(); } return m_Singleton; }

优点:直到对象要求产生一个实例才执行实例化

缺点:线程不安全,并发执行时,如果尚未创建实例,会创建多个实例

示例2

        private Singleton()
        {
            Console.WriteLine("{0}被构造,线程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
        }

        private static readonly Singleton m_Singleton = new Singleton();

        public static Singleton CreateInstance()
        {
            return m_Singleton;
        }    

优点:线程安全

缺点:静态初始化由CLR执行,缺少实例化机制的控制权 。在程序启动或第一次访问引用了类的任何成员时实例已经被创建。

示例3

        private Singleton()
        {
            Console.WriteLine("{0}被构造,线程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
        }

        private static Singleton m_Singleton = null;

        private static readonly object m_Object = new object();

        public static Singleton CreateInstance()
        {
       //提高系统性能。锁会阻塞线程,对象被实例化后不再需要线程排队等待
if (m_Singleton == null) {
          //保证锁住部分只有一个线程执行
lock (m_Object) {
            //确保单线程时 对象只被创建一次
if (m_Singleton == null) { m_Singleton = new Singleton(); } } } return m_Singleton; }

优点:解决线程并发问题,将实例化延迟到第一次访问对象时发生

使用场景:系统的任务管理器,配置文件的读取,数据库连接池的设计,多线程的线程池设计,应用程序的日志应用等。

说到这里有人会问:

1.有了静态类,为什么还要有“单例”?

静态类是一种语法,而单例模式是一种思想。

静态类不可以继承类或实现接口。

静态类中不能声明实例成员。即静态类中所有的字段,属性,方法等都必须是静态的。

无法控制静态成员的初始化。 

设计模式是前人不断尝试、改进后提炼出来的思想。但我们不要生搬硬套,适合的才是最好的。在此,关于单例模式的学习到此结束。谢谢您的阅读

由于博主能力有限,文中可能存在不正确的地方,欢迎斧正,补充。        

原文地址:https://www.cnblogs.com/jdzhang/p/6895311.html