单例模式

Posted wskxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

1.单线程的单例模式

class定义如下:

public class Singleton
    {
        private Singleton()//构建函数私有化,使外部无法直接实例化这个类
        {
            Thread.Sleep(1000);
            Console.WriteLine("{0}被构造,线程id={1}",this.GetType().Name,Thread.CurrentThread.ManagedThreadId);
        }
        private static Singleton _singleton=null;//声明一个类_singleton
        public static Singleton CreateInstance()//给外部一个调用这个类的入口
        {
            if(_singleton==null)//判断该类是否已经实例化,如果没有,则实例化;若是,直接返回该类
            {
                _singleton = new Singleton();
            }
            return _singleton;
        }
        public void show()//测试调用函数
        {
            Console.WriteLine("{0}调用了show",this.GetType().Name);
        }
    }

  Program如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SingletonPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            for(int i = 1; i <= 10; i++)//循环多次调用实例化函数
            {
                Singleton singleton = Singleton.CreateInstance();
                singleton.show();
            }
            Console.ReadLine();
        }
    }
}

  结果:仅实例化一次

    技术分享图片

2.多线程的单例模式(也支持单线程)

  1)多线程Program如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SingletonPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            for(int i = 1; i <= 10; i++)//循环多次调用实例化函数
            {
                new Action(() =>        //使循环变成一个多线程
                {
                    Singleton singleton = Singleton.CreateInstance();
                    singleton.show();
                }).BeginInvoke(null,null);//启动一个异步多线程调用
            }
            Console.ReadLine();
        }
    }
}

 

   2)class定义的三种模式

  双if+lock模式

public class Singleton
    {
        private Singleton()//构建函数私有化,使外部无法直接实例化这个类
        {
            Thread.Sleep(1000);
            Console.WriteLine("{0}被构造,线程id={1}",this.GetType().Name,Thread.CurrentThread.ManagedThreadId);
        }
        private static Singleton _singleton=null;//声明一个类_singleton
        private static object Singleton_lock = new object();
        public static Singleton CreateInstance()//给外部一个调用这个类的入口
        {
            if (_singleton == null)//如果已经实例化,则后续线程不需要再等待锁,提高性能
            {
                lock (Singleton_lock)//保证只有一个线程进入判断
                {
                    Thread.Sleep(1000);
                    if (_singleton == null)//判断该类是否已经实例化,如果没有,则实例化;若是,直接返回该类
                    {
                        _singleton = new Singleton();
                    }
                }
            }
            return _singleton;
        }
        public void show()//测试调用函数
        {
            Console.WriteLine("{0}调用了show",this.GetType().Name);
        }
    }

  静态构造函数模式

public class Singleton
    {
        private Singleton()//构建函数私有化,使外部无法直接实例化这个类
        {
            Thread.Sleep(1000);
            Console.WriteLine("{0}被构造,线程id={1}",this.GetType().Name,Thread.CurrentThread.ManagedThreadId);
        }
        private static Singleton _singleton=null;//声明一个类_singleton
        /// <summary>
        /// 静态构造函数,由CLR保证,函数在被调用前会调用且只调用一次这个静态构造函数
        /// </summary>
        static Singleton ()
        {
            _singleton = new Singleton();
        }

        public static Singleton CreateInstance()//给外部一个调用这个类的入口
        {
            return _singleton;
        }
        public void show()//测试调用函数
        {
            Console.WriteLine("{0}调用了show",this.GetType().Name);
        }
    }

  静态变量模式

    public class Singleton
    {
        private Singleton()//构建函数私有化,使外部无法直接实例化这个类
        {
            Thread.Sleep(1000);
            Console.WriteLine("{0}被构造,线程id={1}",this.GetType().Name,Thread.CurrentThread.ManagedThreadId);
        }
        /// <summary>
        /// 静态变量,由CLR保证,会在这个类第一次使用的时候初始化,且只初始化一次
        /// </summary>
        private static Singleton _singleton=new Singleton ();

        public static Singleton CreateInstance()//给外部一个调用这个类的入口
        {
            return _singleton;
        }
        public void show()//测试调用函数
        {
            Console.WriteLine("{0}调用了show",this.GetType().Name);
        }
    }

 


以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块