当前位置: 首页 > 编程日记 > 正文

设计模式——单例模式(Singleton)

保证一个类仅有一个实例,并提供一个访问它的全局访问点。——DP

UML类图

模式说明

个人认为单例模式是所有设计模式中最为简单的一个模式,因为实现这个模式仅需一个类,而不像其他模式需要若干个类。这个模式中,需要注意的一点就是获取实例时的线程安全问题。

通常单例模式的实现方式如下:

   class ToolBox{// 阻止外部实例化ToolBoxprivate ToolBox(){guid = Guid.NewGuid();}private static ToolBox instance;private static object lockObj = new object();//提供一个全局访问点public static ToolBox GetToolBoxInstance(){if (instance != null) return instance;//要考虑线程安全问题lock (lockObj){if (instance == null){instance = new ToolBox();}}return instance;}#region 用于测试private Guid guid;public void ShowGuid(){Console.WriteLine(guid.ToString());}#endregion}

另外,C#语言中提供一种“静态初始化”功能,对静态初始化器的调用是由CLR控制的,并且CLR会解决线程安全问题,保证只调用一次。所以也可以利用这个特性,来简化单例模式的C#实现:

    class ToolBox2{// 阻止外部实例化ToolBox2private ToolBox2() { guid = Guid.NewGuid(); }//静态内联初始化private static readonly ToolBox2 instance = new ToolBox2();//提供一个全局访问点public static ToolBox2 GetToolBoxInstance(){return instance;}#region 用于测试private Guid guid;public void ShowGuid(){Console.WriteLine(guid.ToString());}#endregion}

客户端访问代码如下(从输出可以看到,每次访问获取的都是同一个实例):

        static void Main(string[] args){// 测试单例模式for (int i = 0; i < 10; i++){new Thread(x =>ToolBox.GetToolBoxInstance().ShowGuid()).Start();}Thread.Sleep(200);Console.WriteLine();// 测试单例模式for (int i = 0; i < 10; i++){new Thread(x =>ToolBox2.GetToolBoxInstance().ShowGuid()).Start();}/* 输出如下f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd5f38db210-20bc-4c2d-8d43-40a0e58fedd58398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c8398be29-abd3-4abd-abf8-4fd09641427c*/Console.ReadKey();}

总结

单例模式和前面介绍的工厂模式(工厂方法、抽象工厂)都属于创建型模式,负责类的实例化过程。单例模式的实现过程,只需要一个类,算是最简单的一个模式,在多线程环境下,单例模式的实现必须保证线程安全,否则在多个线程同时访问时,可能产生多个实例。在C#中,可以通过语言本身的特性(静态初始化器)来更简洁地实现单例模式。

参考

  1. 程杰老师  《大话设计模式》

转载于:https://www.cnblogs.com/hecool/p/3313409.html

相关文章:

l-logger命令基本介绍

logger是一个shell命令接口&#xff0c;可以通过该接口使用Syslog的系统日志模块&#xff0c;还可以从命令行直接向系统日志文件写入一行信息 logger语法: 可以使用的相关命令 -d, --udp 使用数据报(UDP)而不是使用默认的流连接(TCP) -i, --id 逐行记录每一次logger的进程…

红旗linux可以做服务器吗,在红旗Linux中的E-MAIL服务器(postfix及dovecot)配置过程...

在红旗Linux中打开一个系统终端&#xff0c;使用纯文本方式配置邮件服务器&#xff1a;1、进入postfix服务(smtp服务&#xff0c;用来发送服务)配置文件目录&#xff1a;输入如下命令&#xff1a;cd /etc/postfix2、使用邮件服务器的模板配置文件main.cf.default覆盖原配置文件…

Spring Filter过滤器,Spring拦截未登录用户权限限制

实现的功能&#xff1a;判断用户是否已登录&#xff0c;未登录用户禁止访问任何页面或action&#xff0c;自动跳转到登录页面。 比较好的做法是不管什么人都不能直接访问jsp页面&#xff0c;要访问就通过action&#xff0c;这样就变成了一个实实在在的权限控制了。 那么就有3种…

NOIP模拟 蛋糕(DP+Dilworth定理)

QAQ 【题目分析】 谁能告诉我为什么我的网络流炸了吗。。。。。。。。&#xff08;我相信是SPJ的锅这年头暴力不好打啊&#xff09; 所以我们按x排序&#xff0c;然后就是要找到序列中严格上升序列的最少个数&#xff0c;然后。。。。duang。。。。Dilworth定理&#xff08;上升…

l-lsblk查看设备可用块设备

lsblk命令&#xff08;列出块设备&#xff09;用于列出所有可用的块设备的信息&#xff0c;但是&#xff0c; 它并没有列出有关的RAM磁盘的信息。块设备的例子是硬盘&#xff0c;闪存驱动器&#xff0c;CD-ROM等等,一般可以和blkid命令搭配,blkid可以查看更详细的磁盘信息&…

hdu 4720

最小覆盖圆的模板&#xff1b; 1 #include<stdio.h>2 #include<string.h>3 #include<math.h>4 struct Point5 {6 double x;7 double y;8 } pt[1005];9 struct Traingle10 {11 struct Point p[3];12 };13 struct Circle14 {15 struct Point c…

opencv可以在linux上运行,linux上 安装并 运行opencv

我是在树莓派上安装的。1.先安装依赖项OpenCV 2.2以后版本需要使用Cmake生成makefile文件&#xff0c;因此需要先安装cmake。sudo apt-get install build-essentialsudo apt-get install cmakesudo apt-get install libgtk2.0-devsudo apt-get install pkg-configsudo apt-get …

Calendar类点点滴滴积累

为什么80%的码农都做不了架构师&#xff1f;>>> set(f, value) 将日历字段 f 更改为 value。此外&#xff0c;它设置了一个内部成员变量&#xff0c;以指示日历字段 f 已经被更改。尽管日历字段 f 是立即更改的&#xff0c;但是直到下次调用 get()、getTime()、get…

3.3 栈的链式存储结构

<?php header("content-type:text/html;charsetutf-8"); /*** 栈的链式存储结构的基本操作**包括* 1.初始化 __contruct()* 2.进栈操作 push()* 3.出栈操作 pop()* 4.销毁栈 destroyStack()* 5.清空栈 clearStack()* 6.遍历栈 stackTraverse()*/ class Node{publ…

readelf 读取动态链接表命令

readelf -sV xxx 查看指定二进制文件运行时的加载库以及对应版本 并依据该命令可以修改某一二进制文件依赖的glibc库函数的版本&#xff0c;从而让改二进制程序可以运行在低版本的操作系统 readelf 读取链接表头 readelf -h xxx ELF文件介绍 ELF&#xff08;executable and …

[转]cocos2d-x

Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎&#xff0c;使用 C 开发&#xff0c;基于OpenGL ES&#xff0c;基于Cocos2d-iphone&#xff0c;支持 WOPhone, iOS 4.1, Android 2.1 及更高版本, WindowsXP & Windows7&#xff0c;WindowsPhone 8.[1]Cocos2d-x是一个开源的…

Linux哪个和Windows很像,Linuxfx - 这套Linux操作系统看起来和Windows 10非常类似

正如你在截图中所看到的那样&#xff0c;Linuxfx的外观和感觉与Windows 10非常类似&#xff0c;甚至还可以得到一个带有Windows开始按钮的开始菜单&#xff0c;然而&#xff0c;这个实际上可能是一个问题&#xff0c;因为微软可能不喜欢在另一个操作系统中看到它的Windows标志。…

OSPF工作原理

ospf工作原理链路状态路由协议open标准最短路径优先&#xff08;spf&#xff09;算法链路状态路由协议&#xff08;vs&#xff0c;距离矢量&#xff09;与rip的区别 rip是周期性更新&#xff08;30&#xff09;ospf 不发送完整的路由条目但是它发送链路状态的更新有不同的分…

第十八章 MySQL Workbench5.2使用(待续)

转载于:https://www.cnblogs.com/hzzjj/p/9826074.html

r-rpm常用命令集

rpm 安装rpm包 rpm -ivh xxx.rpm rpm -ivh --nodeps --force xxx.rpm强行安装&#xff0c;不考虑依赖性 rpm --nodeps --force -Uvh *同样强行安装&#xff0c;不考虑依赖性 查看一个文件夹属于那个rpm包 rpm -qf /path/filename 查看文件属于哪个rpm包 rpm -qf xxx.so …

MySQL-存储过程

我们常用的操作数据库语言SQL语句在执行的时候需要要先编译, 然后执行; 而存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集, 经编译后存储在数据库中, 用户通过指定存储过程的名字并给定参数&#xff08;如果该存储过程带有参数&#xff0…

查看linux虚拟机信息,虚拟机:Linux查看线程信息的步骤

1. 使用 pstree -p PIDps aux | grep firefox | grep -v grepcharles 26058 0.0 0.0 4908 1152 &#xff1f; S 19:17 0:00 /bin/sh /usr/lib/firefox-3.5.4/run-mozilla.sh /usr/lib/firefox-3.5.4/firefoxcharles 26073 7.6 3.4 284264 70164 &#xff1f; Sl 19:17 4:36 /us…

下载备忘:甘特图实现的代码

通过asp.net 代码&#xff0c;拼接字符串&#xff0c;实现甘特图。 样式和原型全部来源于jquery.ganttView插件&#xff0c; https://github.com/mbielanczuk/jQuery.Gantt 通过修改该代码&#xff0c;实现了可以调节高度&#xff0c;宽度等多种参数&#xff0c;具体看代码即可…

Spyder更改默认工作路径已经文件路径

打开spyder&#xff0c;选择菜单栏中的Tools--->Preferences--->Current working directory 然后选择最下面的单选按钮The following directory 。具体操作如下所示 更改文件存放路径 直接点击右上角的的文件夹图标 选择合适的路径即可&#xff1a; 希望能帮到你 转载…

mysql字段类型

数字类型 列类型 需要的存储量 范围、备注 TINYINT 1 个字节 一个很小的整数 有符号的范围是-128到127&#xff0c;无符号的范围是0到255 SMALLINT 2 个字节 一个比较小的整数 有符号的范围是-32768到32767&#xff0c;无符号的范围是0到65535 MEDIUMINT 3 个字节 一…

s-sed替换或者修改文件指定行,同时匹配多个字符串,替换换行符为指定字符

最近需要在脚本中修改几个配置文件参数且不能影响其他参数&#xff0c;于是想到了sed的强大之处&#xff0c;拿来学学 -i参数表示直接替换并修改文件 -i参数时直接修改文件 sed -i s/aaa/bbb/g testfile 将testfile文件中的aaa替换为bbb字符串 删除文件指定行或者某行内容 sed…

linux中非法内存,Linux下数组非法访问导致内存破坏 —— 引发segmentation fault的原因...

2012-02-05 wcdj1, 调试时必需的栈知识2, 数组非法访问导致内存破坏调试时必需的栈知识栈(stack)是程序存放数据的内存区域之一&#xff0c;其特征是LIFO(Last In First Out, 后进先出)式数据结构&#xff0c;即后放进的数据最先备取出。向栈中存储数据的操作称为PUSH(压入)&am…

基于Matlab和Wind SQL数据库的通用选股策略回测程序

function [y,varargout]backtestcomplex(x,varargin) % Created on 2012-07-15 % latest justified on 2012-09-20 % 输入x是一个excel文件的地址字符串&#xff0c;如‘E:\Top50.xlsx’, excel文件的第一行为表头&#xff0c;包含4列&#xff1a;股票交易代码(SZ000001&#x…

Bzoj1123 Blockade

题目链接&#xff1a;https://loj.ac/problem/10104 日常水题&#xff0c;题目中已经给出了算法&#xff0c;写个模板即可&#xff0c;不会割点的这里有一篇博客&#xff1a;https://www.cnblogs.com/WWHHTT/p/9745499.html 难点是每个对可以互换顺序&#xff0c;然后删掉一个点…

sgdisk 磁盘操作命令

划分磁盘分区 sgdisk -n 1:2G:50G /dev/sda 划分磁盘分区&#xff0c;一号分区划分为50G&#xff0c;同时预留2G的空间 磁盘格式化 sgdisk -z -og /dev/sda 查看分区详情 sgdisk -i 1 /dev/hda查看hda第一分区的详情信息 [rootnode3 ~]# sgdisk -i 1 /dev/sdb Partition G…

spring.factories文件的作用

即spring.factories文件是帮助spring-boot项目包以外的bean(即在pom文件中添加依赖中的bean)注册到spring-boot项目的spring容器中。在Spring Boot启动时,它会扫描classpath下所有的spring.factories文件,加载其中的自动配置类,并将它们注入到Spring ApplicationContext中,使得项目能够自动运行。spring.factories文件是Spring Boot自动配置的核心文件之一,它的作用是。

Spring事务七大传播机制与五个隔离级别,嵌套事务

如果当前方法正有一个事务在运行中,则该方法应该运行在一个嵌套事务中,被嵌套的事务可以独立于被封装的事务中进行提交或者回滚。如果封装事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务。当前方法必须在一个具有事务的上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。当前方法必须运行在它自己的事务中。一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行。

emacs python环境配置

python作为日常用语&#xff0c;配置好emacs的开发环境&#xff0c;有效提高日后的开发效率。 几篇老外的文章作为参考&#xff1a; Configing emacs as a python ide python、emacs 安装python和emacs就不用说了&#xff0c;这是必须的&#xff0c;apt-get安装即可 基础python…

编写linux下跑马灯应用程序,01 arm11 led 跑马灯程序

.text.globl _start_start:ldr r0, 0x70000000orr r0, r0, #0x13mcr p15, 0, r0, c15, c2, 4ldr r0, 0x7e004000mov r1, #0str r1, [r0]ldr sp, 8*1024bl xxxxb .start.S文件代码&#xff1b;void delay (){int i;for (i 0; i < 100000; i);}int xxxx (void){volatile unsi…

Exchange 2013防止数据丢失DLP预览

介绍 防止数据丢失&#xff08;Data loss Prevention&#xff09;是Exchange Server 2013带来的一个新功能&#xff0c;感觉其实应该叫做防止数据泄露&#xff0c;许多第三方工具和设备也有类似的功能&#xff0c;而在Exchange 2013种已经直接集成了&#xff0c;并且之前的传输…