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…

12抽象工厂(Abstract Factory)

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

13建造者模式(Builder)

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

15原型模式(Prototype)

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

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): 在软件系统中&#…

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): 将对象组合…

23装饰模式(Decorator Pattern)

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

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

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

25外观模式(Facade Pattern)

动机(Motivate): 在软件开发系统中&#xff0c;客户程序经常会与复杂系统的内部子系统之间产生耦合&#xff0c;而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口&#xff1f;如何将复杂系统的内部子系统与客户程序之间的依赖解耦&#…

mysql mybatis类型对应_Mybatis与数据库的类型对应

Mybatis与数据库的类型对应由于业务的改变&#xff0c;在首次存入数据库时某些int属性并没有赋值&#xff0c;于是默认值就开始污染数据库了。java实体属性对应mysql和SQL Server 和Oracle 数据类型对应1&#xff1a;Java数据类型与MySql数据类型对照表*对于bolb&#xff0c;一…

26享元模式(Flyweight Pattern)

面向对象的代价 面向对象很好地解决了系统抽象性的问题&#xff0c;同时在大多数情况下&#xff0c;也不会损及系统的性能。但是&#xff0c;在 某些特殊的应用中下&#xff0c;由于对象的数量太大&#xff0c;采用面向对象会给系统带来难以承受的内存开销。比如: 图形应用…

mysql一个事务多个log_MySQL识别一个binlog中的一个事物

MySQL测试版本5.7.14设置GTID_MODEONON(3): Both new and replicated transactions must be GTID transactions(生成的是GTID事物&#xff0c;slave也只能应用GTID事物)设置binlog格式为row模式做如下操作mysql> insert into test values(1,2);Query OK, 1 row affected (0.…

go for 循环遍历数组并排序_10. Go语言流程控制:for 循环

本文原文&#xff1a;http://golang.iswbm.comGithub&#xff1a;http://github.com/iswbm/GolangCodingTimeGo里的流程控制方法还是挺丰富&#xff0c;整理了下有如下这么多种&#xff1a;if - else 条件语句switch - case 选择语句for - range 循环语句goto 无条件跳转语句de…

27代理模式(Proxy Pattern)

直接与间接&#xff1a; 人们对复杂的软件系统常有一种处理手法&#xff0c;即增加一层间接层&#xff0c;从而对系统获得一种更为灵活、 满足特定需求的解决方案。 …

31模板方法(Template Method)

无处不在的Template Method 如果你只想掌握一种设计模式&#xff0c;那么它就是Template Method! 动机(Motivate): 变化 -----是软件设计的永恒主题&#xff0c;如何管理变化带来的复杂性&#xff1f;设计模式的艺术性和复杂度就在于如何 分析&#xff0c;并发现系统中…

bat 脚本清空窗口内容_tomcat9.0启动脚本startup.bat的分析

1、 Apache Tomcat的下载和安装从Apache官网https://tomcat.apache.org/可以下载各种版本的tomcat软件&#xff0c;下载的文件格式可以是zip/tar.gz/exe形式的。如下图所示&#xff0c;在64位windows中使用tomcat&#xff0c;我们可以下载"64-bit Windows.zip",直接解…