11单件模式(Singleton Pattern)

创建型模式---单件模式(Singleton Pattern)
动机(Motivation):
    在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
    如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例?
    这应该是类设计者的责任,而不是类使用者的责任。
结构图:
        
意图:
    保证一个类仅有一个实例,并提供一个访问它的全局访问点。
                                ------<<设计模式>>GOF
生活的例子:
          
适用性:
   (1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
   (2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

代码实现:
(1)单线程Singleton实现
  

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


以上代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。
如两个线程同时运行到 if (instance == null)判断是否被实例化,一个线程判断为True后,在进行创建
 instance = new SingleThread_Singleton();之前,另一个线程也判断(instance == null),结果也为True.
这样就就违背了Singleton模式的原则(保证一个类仅有一个实例)。
怎样在多线程情况下实现Singleton?
(2)多线程Singleton实现:

 1    class MultiThread_Singleton
 2     {
 3       private  static volatile MultiThread_Singleton instance = null;
 4       private static object lockHelper = new object();
 5       private MultiThread_Singleton() { }
 6       public static MultiThread_Singleton Instance
 7       {
 8           get
 9           {
10               if (instance == null)
11               {
12                   lock (lockHelper)
13                   {
14                       if (instance == null)
15                       {
16                           instance = new MultiThread_Singleton();
17                       }
18                   }
19               }
20               return instance;
21           }         
22       }
23     

此程序对多线程是安全的,使用了一个辅助对象lockHelper,保证只有一个线程创建实例(如果instance为空,保证只有一个线程instance = new MultiThread_Singleton();创建唯一的一个实例)。(Double Check)
请注意一个关键字volatile,如果去掉这个关键字,还是有可能发生线程不是安全的。
volatile 保证严格意义的多线程编译器在代码编译时对指令不进行微调。
(3)静态Singleton实现


3         class Static_Singleton
4         {
5             public static readonly Static_Singleton instance = new Static_Singleton();
6             private Static_Singleton() { }
7         }


以上代码展开等同于

1     class Static_Singleton
2         {
3             public static readonly Static_Singleton instance;
4             static Static_Singleton()
5             {
6                 instance = new Static_Singleton();
7             }
8             private Static_Singleton() { }
9         }

由此可以看出,完全符合Singleton的原则。
优点: 简洁,易懂
缺点: 不可以实现带参数实例的创建。
(注:以上代码及信息借鉴于李建忠老师的MSDN和TerryLee的文章。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查找字符位置_如何使用find函数和search函数精确查找字符

精确查找指定字符在一个字符串中的位置是Excel函数运用中的一项重要的技巧&#xff0c;尤其是在截取字符串、替换字符串等文本处理过程中&#xff0c;精确定位技术更是必不可少。查找字符的主要函数是find函数和search函数&#xff0c;两者的语法完全相同。find(find_text,with…

梦幻新开服务器维护,梦幻西游1月新区2017 1月新开服务器介绍

梦幻西游1月新区2016有什么呢&#xff0c;这个月的新开服务器已经出来了&#xff0c;很多朋友已经邀上自己的小伙伴们开战了&#xff0c;有的还没放假就等着下个月的新区了&#xff0c;下面我们就来看。梦幻西游1月新区2016&#xff1a;转眼步入2016年&#xff0c;在2016年1月份…

12抽象工厂(Abstract Factory)

常规的对象创建方法&#xff1a; //创建一个Road对象 Road road new Road(); new 的问题&#xff1a; 实现依赖&#xff0c;不能应对“具体实例化类型”的变化。解决思路&#xff1a; 封装变化点-----哪里变化&#xff0c;封装哪里 潜台词&#xff1a; 如果没有变…

typeahead有什么作用_typeahead使用配置参数。

示例代码&#xff1a;var suggestion_source new Bloodhound({datumTokenizer: Bloodhound.tokenizers.obj.whitespace("display_name"),queryTokenizer: Bloodhound.tokenizers.whitespace,remote: {url: "http://nominatim.openstreetmap.org/search?format…

dhcp服务器能为客户端提供哪些信息,为DHCP客户端提供DHCP服务器的MAC [关闭]

Background info:我有一套专有的嵌入式Linux网络设备&#xff0c;其中一个将配置为DHCP服务器&#xff0c;其余的将是DHCP客户端 .我需要让客户端设备只接受来自服务器设备的DHCP租约&#xff0c;忽略同一LAN上其他DHCP服务器提供的任何其他租约 . 同样&#xff0c;我需要使服务…

13建造者模式(Builder)

Builder模式的缘起&#xff1a; 假设创建游戏中的一个房屋House设施&#xff0c;该房屋的构建由几部分组成&#xff0c;且各个部分富于变化。如果使用最直观的设计方法&#xff0c;每一个房屋部分的变化&#xff0c;都将导致房屋构建的重新修正.....动机&#xff08;Motiva…

mongo更新数组字段_更新mongodb中嵌套数组中的几个字段(使用pymongo)

我正在尝试更新数组内数组中的一些字段示例文档如下&#xff1a;{id: 987654321tweets: [{text: "RT 947FreshFM: A vigil will be held for #SandyHook victims at UMd. at 7pm at Nyumburu Ampitheater. BlackTerp",urls: [],id: 279718351289348100},{text: "…

15原型模式(Prototype)

依赖关系倒置&#xff1a; 动机(Motivate): 在软件系统中&#xff0c;经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 如何应对这种变化&#xff1f;如何向“客户…

安装mlxtend_python机器学习包mlxtend的安装和配置详解

今天看到了mlxtend的包&#xff0c;看了下example集成得非常简洁。还有一个吸引我的地方是自带了一些data直接可以用&#xff0c;省去了自己造数据或者找数据的处理过程&#xff0c;所以决定安装体验一下。依赖环境首先&#xff0c;sudo pip install mlxtend 得到基础环境。然后…

14工厂方法模式(Factory Method)

耦合关系&#xff1a; 动机(Motivation): 在软件系统中&#xff0c;由于需求的变化&#xff0c;"这个对象的具体实现"经常面临着剧烈的变化&#xff0c;但它却有比较稳定的接口。 如何应对这种变化呢&#xff1f;提供一种封装机制来隔离出"这个易…

mysql 更新错误1062_mysql 出现1062错误怎么办

mysql 出现1062错误的解决办法&#xff1a;首先打开mysql的配置文件【my.cnf】&#xff1b;然后在client和mysqld下面加上相关代码&#xff1b;最后存关闭后重启mysql即可。mysql 出现1062错误的解决办法&#xff1a;两个instance的版本接近&#xff0c;猜测不是版本问题。执行…

21适配器模式(Adapter Pattern)

适配&#xff08;转换&#xff09;的概念无处不在...... 适配&#xff0c;即在不改变原有实现的基础上&#xff0c;将原先不兼容的接口转换为兼容的接口。 例如&#xff1a;二转换为三箱插头&#xff0c;将高电压转换为低电压等。 动机(Motivate): 在软件系统中&#…

mysql命令书写顺序_MySQL SQL语句书写顺序和执行顺序

SQL语句书写顺序和执行顺序(7) SELECT(8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9) ORDER BY (10) LIMIT 书写顺序从上向下依次书写&#xff0c;即&#xff1a;SELECT →FROM → JOIN → ON → WHERE → GROUP BY → HAVING → ORDER BY→ LI…

22桥接模式(Bridge Pattern)

动机(Motivate): 在软件系统中&#xff0c;某些类型由于自身的逻辑&#xff0c;它具有两个或多个维度的变化&#xff0c;那么如何应对这种“多维度的变化”&#xff1f;如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化&#xff0c;而又不引入额外的复杂度…

mysql动静分离_haproxy的web服务负载均衡、动静分离、 MySQL服务负载均衡、状态监控...

实验环境&#xff1a;基于centos6.6haproxy-Server&#xff1a;172.16.249.98 hostname:node1upsteram server1&#xff1a;172.16.249.100 hostname:node2upstream server2&#xff1a;172.16.249.99 hostname:node3web服务的负载均衡以及状态监控&#xff1a;设置记录hapro…

24组合模式(Composite Pattern)

动机(Motivate): 组合模式有时候又叫做部分-整体模式&#xff0c;它使我们树型结构的问题中&#xff0c;模糊了简单元素和复杂元素的概念&#xff0c;客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。意图(Intent): 将对象组合…

mysql二进制日志被删除无法启动_mysql二进制日志文件出错导致mysql服务无法启动...

今天打开phpmyadmin发现连不上mysql数据库&#xff0c;重启mysql启动不起来&#xff0c;查看日志发现如下错误mysqld: File .\mysql-bin.000370 not found (Errcode: 2)141120 13:23:13 [ERROR] Failed to open log (file .\mysql-bin.000370, errno 2)141120 13:23:13 [ERROR]…

kafka mysql事务_【干货】Kafka 事务特性分析

特性背景消息事务是指一系列的生产、消费操作可以要么都完成&#xff0c;要么都失败&#xff0c;类似数据库的事务。这个特性在0.10.2的版本是不支持的&#xff0c;从0.11版本开始才支持。华为云DMS率先提供Kafka 1.1.0的专享版服务&#xff0c;支持消息事务特性。支持事务消息…

23装饰模式(Decorator Pattern)

子类复子类&#xff0c;子类何其多 假如我们需要为游戏中开发一种坦克&#xff0c;除了各种不同型号的坦克外&#xff0c;我们还希望在不同场合中为其增加以下一种或多种功能;比如红外线夜视功能&#xff0c;比如水陆两栖功能&#xff0c;比如卫星定位功能等等。 按类继承的作法…

gb2312编码在线转换_python基础学习—04字符串与编码

点击上方蓝字关注我们不迷路&#xff01;字符串与编码一、了解计算机编码1.1 编码定义&#xff1a;将信息从一种形式转换为另外一种形式的过程叫做编码&#xff0c;即信息转换过程举例&#xff1a;信息加密解密、语言翻译1.2 计算机编码定义&#xff1a;将计算机可读信息转换…