zoukankan      html  css  js  c++  java
  • 设计模式单件模式

    单件模式:

    确保一个类只有一个实例,并提供一个全局的访问点.

    通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是让类自身负责保存它的唯一实例.这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法.

    关键词:

    SingleTon:单独的

    结构图:

    image

    实现1:

    public sealed class SingleTon
    {
        static SingleTon single = null;
    	private SingleTon()
    	{
    		//
    		//TODO: 在此处添加构造函数逻辑
    		//
    	}
    
        public static SingleTon GetInstance()
        {
            if (single == null)
            {
                single = new SingleTon();
            }
    
            return single;
        }
    }

    此种实现是不安全的,当有多个线程去访问时,会同时得到single==null为true.此时会得到singleton的两个实例.

    实现2:

    public sealed class SingleTon
    {
        static SingleTon single = null;
        static readonly object padlock = new object();
    
        private SingleTon()
        {
            //
            //TODO: 在此处添加构造函数逻辑
            //
        }
    
        public static SingleTon GetInstance()
        {
            lock (padlock)
            {
                if (single == null)
                {
                    single = new SingleTon();
                }
            }
    
            return single;
        }
    }
    此种实现对线程来说也是安全的,但是,每次访问之前,都需要加锁判断,此时会消耗大量的系统资源.所以,采用双重加锁的方式来进行设计.
    实现3:
    public sealed class SingleTon
    {
        static SingleTon single = null;
        static readonly object padlock = new object();
    
    	private SingleTon()
    	{
    		//
    		//TODO: 在此处添加构造函数逻辑
    		//
    	}
    
        public static SingleTon GetInstance()
        {
            if (single == null)
            {
                lock (padlock)
                {
                    if (single == null)
                    {
                        single = new SingleTon();
                    }
                }
            }
    
            return single;
        }
    }
     

    优点:

      1. SingleTon会保证只有此类只有一个实例,保证所有引用均引用自此实例
      2. 修改很方便,只需修改一处,即可保证全盘更新

    缺点:

    每次生成实例之前需要判断该实例是否存在

    适用场景:

     当类有且只有一个实例时,可以使用SingleTon模式. 

    解释:

    lock:lock是确保一个线程位于代码的临界区时,另一个线程不能进入该临界区,如果其它线程试图进入锁定的代码,则它将一直等待,直到该对象被释放.

  • 相关阅读:
    QQ邮箱开启SMTP服务的步骤
    delete
    (三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
    (四)SAX方式解析XML数据
    If-Modified-Since页面是否更新
    基于分块统计和机器学习的主题类网页内容识别算法实现和应用范例
    文本去重第一步:基于内容的文本相似性计算
    java中int,float,long,double取值范围,内存泄露
    Linux多线程服务端编程:使用muduo C++网络库
    HttpClient使用详解
  • 原文地址:https://www.cnblogs.com/oneword/p/1514712.html
Copyright © 2011-2022 走看看