Singleton 单件

模式分类

从目的来看:

-创建型(Creational)模式:负责对象创建

-结构型(Structural)模式:处理类与对象间的组合

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

从范围来看:

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

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

 

动机(Motivation)

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

如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

这应该是类设计者的责任,而不是使用者的责任

 

意图(Intent)

保证一个类仅有一个实例,并提供一个该实例的全局访问点

——《设计模式GoF》

 

结构(Structure)

image

 

单线程Singleton模式实现

image

 

私有的实例构造器是为了屏蔽默认产生的构造器,让类的使用者无法调用构造器。

 

单线程Singleton模式的几个要点

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

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

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

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

不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。

 

多线程Singleton模式实现

image

volatile修饰:编译器在编译代码的时候会对代码的顺序进行微调,用volatile修饰保证了严格意义的顺序。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

 

使用.NET类型初始化机制实现多线程Singleton模式

image

以上是内联初始化(生成的同时进行初始化)的单例模式,它等同于:

image

内联初始化其实是把静态的字段放到静态构造器去初始化。反编译出内联初始化的代码可以看出以上结论

image

只要想访问静态字段,必定已经在之前执行了静态构造器。这样也能够精确地保证使用的时候一定能拿到实例,如果不使用也不会实例化对象,也就是延时加载的功能。他同样能够支持多线程环境,因为只可能有一个线程执行静态构造器,不可能有多个线程去执行静态构造器,感觉就是程序已经自动为我们加锁了。

它的一点弊端就是它不支持参数化的实例化方法。在.NET里静态构造器只能声明一个,而且必须是无参数的,私有的。因此这种方式只适用于无参数的构造器。

 

Singleton模式扩展

将一个实例扩展到n个实例,例如对象池的实现。(n不是指无限个实例,而是固定的某个数)

将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。

理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。

 

.NET框架中的Singleton应用

image

t1==t2 这说明,GetType方法获得的Type实例都是单例。

HttpContext.Current也是如此,他们是通过Singleton的扩展方式实现的,他们的单例也并不是覆盖所有领域,只是针对某些局部领域中,是单例的,不同的领域中还是会有不同的实例。

转载于:https://www.cnblogs.com/ajunForNet/p/3748168.html

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

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

相关文章

10个利用Eclipse调试Java的常见技巧

http://www.open-open.com/news/view/1ad9099 阅读目录 1. Conditional Breakpoint2. Exception Breakpoint3. Watch Point4. Evaluation (Display or Inspect or Watch)5. Change Variable Values6. Stop in Main7. Environment Variables8. Drop to Frame9. Step Filter10. S…

操作系统上机作业--创建N个线程(多线程)

ring.c: 创建N个线程,它们构成一个环 • 创建N个线程:T1、T2、T3、… TN • T1向T2发送整数1 • T2收到后将整数加1 • T2向T3发送整数2 • T3收到后将整数加1 • T3向T4发送整数3 • … • TN收到后将整数加1 • TN向T1发送整数N 实…

台式计算机网线,台式电脑如何连接宽带_台式电脑如何连接网线

2017-03-11 21:36:28电脑直接拨号上网(有宽带账号和密码)或者自动获取IP(有帐号没密码)上方式设置见图2016-12-10 13:29:30右击网上邻居,点属性,创建一个新的连接,按照下一步下一步的步骤就可以了,然后成功之后输入你的宽带号码和…

栈的应用--汉诺塔

#include<stdio.h>void move(char x,int n,char y){printf("%d号盘 %c柱 ---> %c柱\n",n,x,y); }void hanoi(int n,char x,char y,char z){if(n1){move(x,1,z);}else{hanoi(n-1,x,z,y);move(x,n,z);hanoi(n-1,y,x,z);} }int main(){int n;char xX;char yY;c…

凭据不工作

最悲催的事情是什么&#xff1f;那就是你可以远程别人的电脑&#xff0c;但是别人不能远程自己的电脑&#xff01; 背景&#xff1a; 换了个win8.1的系统&#xff0c;刚开始可以远程上,过了几天,电脑突然不能远程了,让我很是郁闷呀. 于是在网上查了好多资料,看看他到底是什么原…

计算机专业女兵,陈豪2010《点解阿Sir》剧照

0陈豪2010《点解阿Sir》剧照2012-07-21 08:24{"info": {"setname": "陈豪2010《点解阿Sir》剧照","imgsum_bk": 20,"imgsum": 20,"lmodify": "2012-07-21 08:24:00","prevue": " "…

ASP.NET MVC学习之Ajax(完结)

一.前言 通过上面的一番学习&#xff0c;大家一定收获不少。但是总归会有一个结束的时候&#xff0c;但是这个结束也意味着新的开始。 如果你是从事ASP.NET开发&#xff0c;并且也使用了第三方控件&#xff0c;那么一定会觉得ASP.NET开发ajax十分的简单&#xff0c;而ASP.NET M…

认知计算机语言学,什么是认知语言学

文献综述&#xff1a;“语文素养”内涵研究综述“语文素养”内涵研究综述摘要&#xff1a;“语文素养”是新一轮语文课程改革所提出的一个重要概念&#xff0c;其作为语文课程改革的目标与核心理念&#xff0c;挤兑了“语文能力”的核心地位。目前&#xff0c;人们对“语文素养…

大学新生学计算机推荐电脑,大学新生用什么电脑好呢?

科技的发展日新月异&#xff0c;数码的yi巴为你资讯。今天是7月的开头&#xff0c;我们正式迈入了2019下半年。7月开头也正是许多大多数高考生快忙完志愿填报&#xff0c;开始考虑大学该选择什么电脑的时候。今天yi巴就来跟大家聊聊该大学新生该怎么选择电脑&#xff0c;并给予…

Android,监控ContentProvider的数据改变

有时候应用中需要监听ContentProvider的改变并提供响应&#xff0c;这时候就要利用ContentObserver类了 不管是ContentProvider中实现的,insert,delete,update方法中的任何一个&#xff0c;程序都会调用getContext().getContentResolver().notifyChange(uri,null); 这行代码可用…

插件开发-UI插件开发

1.新建类库解决方案&#xff0c;引入命名空间,同时引入要添加UI Form的WebPart(在Portal\UILib目录下)2.继续UFSoft.UBF.UI.Custom.ExtendedPartBase&#xff0c;重写AfterInit()方法&#xff0c;代码如下&#xff0c;便于添加下拉列表按钮&#xff0c;在原单据中UI先新增一下拉…

为博客园选择一个小巧霸气的语法高亮插件

博客园的语法高亮简直蛋疼&#xff0c;于是乎就打算找一个靠谱的插件来改造下。各种百度谷歌&#xff0c;大致得到几个推荐&#xff1a;SyntaxHighlighter&#xff0c;Snippet&#xff0c;Google Code Pretiffy&#xff0c;Highlight&#xff0c;SHJS。其实 SyntaxHighlighter …

PS图片删除需要计算机管理权限,如何使用PsTools工具执行本地/远程PC管理任务

大多数刚入门的管理员都习惯使用 RDP 或其它类似的工具连接到远程 Windows 中进行图形化管理。而 PowerShell 及 PsTools 等工具可以帮助我们在命令行中执行相当多的管理任务&#xff0c;更主要的是可以将其写成脚本来执行周期性重复任务或在管理大批量服务器时提高效率。在企业…

Python实验:关灯游戏

文章目录 前言一、设计表二、关键代码三、运行结果小地图&#xff0c;容易难度&#xff1a;中地图&#xff0c;中等难度&#xff1a;大地图&#xff0c;困难难度&#xff1a; 四、完整代码链接总结 前言 这是一个Python实验作业&#xff0c;内容如下&#xff1a; 题目要求&am…

python计算圆的面积

用Python创建一个脚本&#xff0c;要求&#xff1a; 能计算半径为2的圆的面积保留10位小数可以直接执行 #!/usr/bin/env python3 import math print("Area is:{:.10f}".format(math.pi*4))计算圆的面积要用到pi&#xff0c;所以我们引用模块math

昆明学院计算机专业在哪个校区,昆明学院有几个校区及校区地址

昆明学院有几个校区及校区地址2017-06-19 11:15:56文/韩竞仪最近有很多考生和家长咨询小编&#xff0c;昆明学院有几个校区&#xff0c;今年新生会被分配到哪个校区?哪个校区好?等相关问题&#xff0c;下面小编统一回复一下考生们的问题。昆明学院有3个校区&#xff0c;分别是…

Solution 19: Fibonacci数列

问题描述 求Fibonacci数列的第n项。Fibonacci数列为1,1,2,3,5,... 解决思路 (1) 递归&#xff0c;指数级时间复杂度&#xff1b; (2) 循环&#xff0c;O(n)时间复杂度&#xff1b; (3) 矩阵乘法&#xff0c;O(logn)时间复杂度&#xff1b; (4) 公式法&#xff0c;O(1)时间复杂度…

ASP.NET MVC 学习第一天

今天开始第一天学习asp.net mvc&#xff0c;写的不是很好&#xff0c;高手不要喷&#xff0c;希望大家能一起进步学习。 好了&#xff0c;开始学习 新建项目&#xff0c;选择mvc 4应用程序 接下来选择基本&#xff0c;视图引擎当然要选择Razor&#xff0c;如果在选择aspx那我们…

计算机显示发送报告,Word文档打不开提示发送错误报告的解决方法

经常使用word文档的人员都会碰到过这种发送错误报告情况&#xff0c;既然有这个问题就要查个究竟什么原因造成&#xff0c;才能完美解决&#xff0c;那么今天小编就在这里讲解word文档发送错误报告的方法。根本原因是&#xff1a;打开word出现提示word发送错误报告的故障其主要…

图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题

图灵机意义图灵提出图灵机的模型并不是为了同时给出计算机的设计&#xff0c;它的意义我认为有如下几点&#xff1a;1、它证明了通用计算理论&#xff0c;肯定了计算机实现的可能性&#xff0c;同时它给出了计算机应有的主要架构&#xff1b;2、图灵机模型引入了读写与算法与程…