zoukankan      html  css  js  c++  java
  • 跟刺猬哥一起学习设计模式【Singleton模式】

    设计模式的分类

    从目的来看:

    创建型模式:负责对象创建

    结构性模式:处理类与对象间的组合

    行为型模式:类与对象交互中的职责分配

    从范围来看:

    类模式处理类与子类的静态关系

    对象模式处理对象间的动态关系

    动机

    在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率。

    如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例呢?其实这应该是类设计者的责任,而不是使用者的责任。

    意图

    保证一个类仅有一个实例,并提供一个该实例的全局访问点。  -----《设计模式》 Gof

    单线程Singleton 模式实现

    public class Singleton
    {
          private static Singleton instance;
          private Singleton() {}   
          public static Singleton Instance
          {
               get
               {
                    if(instance == null)
                    {
                          instance = new Singleton();
                    }
                    return instance;
               }
          }
    }        

    单线程Singleton模式有以下几个要点:

    Singleton模式中的实例构造器可以设置为protected以允许子类派生。

    Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与模式初衷违背。

    Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,与初衷违背。

    Singleton模式只考虑了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,一般没有必要对其销毁进行特护的管理。

    不能应对多线程环境,在多线程环境下,使用可能得到多个实例对象。

    二、多线程下的Singleton模式

    public class Singleton
    {
            private static volatile Singleton _instance=null;
            private static readonly object syslock = new object();  
    
            private Singleton() {}     
    
            public static Singleton Instance()
            {
                if (_instance == null)
                {
                    lock (syslock)
                    {
                        if (_instance == null)
                        {
                            _instance = new Singleton();
                        }
                    }
                }
                return _instance;
            }
    }
    You can reach me by surfing the web ---- huntjobs.cn,or sending e-mails to me,Here is my qq MailBox:1424870395@qq.com
  • 相关阅读:
    爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
    网络爬虫基础练习
    Mysql 使用 select into outfile
    Mysql 使用CMD 登陆
    使用Clean() 去掉由函数自动生成的字符串中的双引号
    Get Resultset from Oracle Stored procedure
    获取引用某个主键的所有外键的表
    Entity Framework 丢失数据链接的绑定,在已绑好的EDMX中提示“Choose Your Data Connection”
    添加MySql Metat Database 信息
    at System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
  • 原文地址:https://www.cnblogs.com/HedgehogBlog/p/5840013.html
Copyright © 2011-2022 走看看