码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2018-02-11 14:52:24      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:饿汉   closed   read   text   ado   sys   使用   str   let   

单列模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。(全局访问和实例化控制)

技术分享图片
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Singleton
{
    class Singleton
    {
        private static Singleton instance;
        private Singleton()
        {
            //使用private修饰构造函数,这样外面调用的时候就没有办法使用new来实例化对象了。
        }
        public static Singleton GetInstance()//此方法是获得本类实例的唯一全局访问点
        {
            if (instance == null)//若不存在,则实例化一个对象,否则返回已有实例。
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}
创建单个对象
技术分享图片
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Singleton
{
    class Program
    {
        static void Main(string[] args)
        {
            Singleton s1 = Singleton.GetInstance();
            Singleton s2 = Singleton.GetInstance();
            if(s1==s2){
                Console.Write("两个对象是相同的实例");
            } 
            Console.Read();
        }
    }
}
主程序
技术分享图片
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Singleton
{
    class Singleton
    {
        private static Singleton instance;
        private static readonly object syncRoot = new object();//程序运行时创建一个静态只读的进程辅助对象。
        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            if (instance == null)//先判断实例是否存在,若不存在则做枷锁处理。
            {

                lock (syncRoot)
                {
                    if (instance == null)//若不存在,则实例化一个对象,否则返回已有实例。
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}
//两处对instance进行判断:
//当instance为null并且同时有两个线程调用GetInstance()的时候,它们将都可以通过第一重instance==null的判断。
//然后由于lock的机制,这两个线程只有一个进入,另一个在外面排队等候,必须要其中一个进入并且出来之后,另一个才能进入。
//而此时若没有第二处的判断,则第一个线程创建了实例,而第二个线程还可以继续创建一个新的实例,这就失去了单列的目的!
多线程下的单例

在C#中,在多线程下的单列可分为:懒汉式单列和饿汉式单例。上面那个是懒汉式的。

利用sealed(密封类)和readonly 关键字

public sealed class Singleton{
    private static readonly Singleton instance=new Singleton();//在第一次引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化
    private Singleton(){}
    public static Singleton  GetInstance(){return instance}    
}

 

单例模式

标签:饿汉   closed   read   text   ado   sys   使用   str   let   

原文地址:https://www.cnblogs.com/vichin/p/8441126.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!