C#设计模式学习笔记-单例模式

C#设计模式学习笔记-单例模式

 

  最近在学设计模式,学到创建型模式的时候,碰到单例模式(或叫单件模式),现在整理一下笔记。

  在《Design Patterns:Elements of Resuable Object-Oriented Software》中的定义是:Ensure a class only has one instance,and provide a global point of access to。它的主要特点不是根据客户程序调用生成一个新的实例,而是控制某个类型的实例数量-唯一一个。(《设计模式-基于C#的工程化实现及扩展》,王翔)。也就是说,单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。

  一、经典模式:

复制代码
public class Singleton
{
private static Singleton instance;

private Singleton()
{

}

public static Singleton GetInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
复制代码

  解析如下:

  1)首先,该Singleton的构造函数必须是私有的,以保证客户程序不会通过new()操作产生一个实例,达到实现单例的目的;

  2)因为静态变量的生命周期跟整个应用程序的生命周期是一样的,所以可以定义一个私有的静态全局变量instance来保存该类的唯一实例;

  3)必须提供一个全局函数访问获得该实例,并且在该函数提供控制实例数量的功能,即通过if语句判断instance是否已被实例化,如果没有则可以同new()创建一个实例;否则,直接向客户返回一个实例。

  在这种经典模式下,没有考虑线程并发获取实例问题,即可能出现两个线程同时获取instance实例,且此时其为null时,就会出现两个线程分别创建了instance,违反了单例规则。因此,需对上面代码修改。

  二、多线程下的单例模式

  1、Lazy模式

复制代码
public class Singleton
{
private static Singleton instance;
private static object _lock=new object();

private Singleton()
{

}

public static Singleton GetInstance()
{
if(instance==null)
{
lock(_lock)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
复制代码

  上述代码使用了双重锁方式较好地解决了多线程下的单例模式实现。先看内层的if语句块,使用这个语句块时,先进行加锁操作,保证只有一个线程可以访问该语句块,进而保证只创建了一个实例。再看外层的if语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),才需加锁创建,若果已存在一个实例,就直接返回该实例,节省了性能开销。

  2、饿汉模式

  这种模式的特点是自己主动实例。

复制代码
public sealed class Singleton
{
private static readonly Singleton instance=new Singleton();

private Singleton()
{
}

public static Singleton GetInstance()
{
return instance;
}
}
复制代码
  上面使用的readonly关键可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。
http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html

转载于:https://www.cnblogs.com/chengjun/p/4955867.html

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

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

相关文章

kotlin为什么比java编译慢_为什么Kotlin编译速度比Scala快? [关闭]

虽然我认为这个问题不适合Stack Overflow,因为它倾向于主要产生基于意见的答案,但这里有一个尝试:你有两种不同的语言,特别是关于类型系统,以及两个完全独立的编译器实现 . 所以期望它们具有“相同”的编译速度已经是一…

锡山国土推行数据中心“在线变更”

为全面提高全区土地变更工作效率,国土锡山分局全面推行数据中心在线变更。由不动产登记科利用数据中心管理平台,将遥感影像、监测信息以及监测图斑的土地利用现状信息、土地利用总体规划信息录入“数据中心”,制定我区的变更调查工作方案&…

Linux 安装loadrunner 碰到的问题

关于linux下面搭建loadrunner的详细步骤: http://blog.sina.com.cn/s/blog_9aa583cf0101bu4y.html http://hi.baidu.com/higkoo/item/d75027acc78bab3e030a4dde?qq-pf-topcqq.c2c http://www.cnblogs.com/xiaoTT/archive/2012/02/15/2352127.html 用控制台加载负载…

数据分析真的能驱动用户快速增长吗?

俗话说,“酒香不怕巷子深”;俗话又说,“酒香也怕巷子深” 。再后来,俗话还说,管他酒香不香巷子深不深,只要找个算盘技巧神乎其神的账房先生,即数据科学家,酒就可以大卖了。这叫做用数据驱动用户…

java 常见bug_java常见bug

org.hibernate.QueryException: could not resolve property: menuId of:无法解析menuId 字段,是指这个字段有错Servlet.service() for servlet default threw exception09:28:54,704 ERROR [CoyoteAdapter] An exception or error occurred in the container durin…

解决启动Biee控制台乱码问题

解决启动Biee控制台乱码问题 在安装完Biee后,大家都可以看到在程序中可以找到启动BI服务的地方 点击上图中的启动bi服务则在window系统中会弹出一个dos窗口,来显示执行启动服务的操作,如下图 上图显示的是正常情况,本人安装后首次…

“北航Clubs” Alpha版发布!

一、功能 1.获取活动信息: 用户进入网站后,第一眼就可以查看到近期活动 2.查看活动详情 点击活动标题,可以进入活动详情页面 3.注册功能 首页点击注册,输入学号、密码、姓名、手机号即可完成注册 4.用户登陆 拥有账号之后&#xf…

物联网与零边际成本共享经济

物联网是由通讯网络、能源网络、物流网络组成,这些网络共同在单一操作系统中合作,持续寻找各种方法来提升资源整编、生产及配送商品和服务,以及废弃物回收等过程中的热力效率和生产力;这三种网络相辅相成,缺一不可。若缺乏通讯&am…

C++程序设计教程学习(1)-第一部分 编程基础

第一章 概述 C到底难不难学?没有学不会的事情 1.1 程序设计语言 语言 编程语言 人和计算机交流的工具,群体扩大,人人间交流过程描述与信息表达的工具 机器语言,汇编语言,高级语言 1.2 C简史 1.3 C 褒贬C 计算机应用范围…

《Programming WPF》翻译 第9章 6.我们进行到哪里了?

《Programming WPF》翻译 第9章 6.我们进行到哪里了? 原文:《Programming WPF》翻译 第9章 6.我们进行到哪里了?只有当任何内嵌控件都没有提供你需要的底层行为时,你将要写一个自定义控件。当你写一个自定义控件,你将要使用到依赖…

php实现上传,PHP实现文件上传例子

实例1:上载文件表单网页:updatefile.htm上载文件表单请选取文件:[CtrlA 全部选择 然后拷贝]处理上载文件网页:updatefile.php3处理上载文件copy($userfile, "newfilename");echo $userfile." - 用户上传到服务器上的文件临时存…

浙企加入中国大数据产业生态联盟 共商数据价值

基于大数据时代的考量,在工业和信息化部指导下,8月2日,中国电子信息产业发展研究院联合大数据产业链各环节企业及第三方产业机构自愿组成非营利社会组织——中国大数据产业生态联盟。浙江企业元宝铺受邀成为联盟理事成员单位。 大会现场&…

hdu 4442 Physical Examination (2012年金华赛区现场赛A题)

昨天模拟赛的时候坑了好久,刚开始感觉是dp,仔细一看数据范围太大。 题目大意:一个人要参加考试,一共有n个科目,每个科目都有一个相应的队列,完成这门科目的总时间为ab*(前面已完成科目所花的总时…

xsd学习教程

http://www.w3school.com.cn/schema/转载于:https://www.cnblogs.com/eric-lin/p/4969269.html

php 赋值 递增,PHP 基础(赋值及函数)

开端<?php>结尾弱类型语言 定义变量的时候 不需要 声明 但是 每一个变量前 都必须 加$ 符号储存文件按 统一放到 安装文件夹下面的 WAMP 下面 的WWW 文件内部 (与创的站点统一即可) 该文件下面不能出现中文注释语法&#xff1a; 单行注释&#xff1a;…

maven project创建填充项

GroupID是项目组织唯一的标识符&#xff0c;实际对应JAVA的包的结构&#xff0c;是main目录里java的目录结构。ArtifactID就是项目的唯一的标识符&#xff0c;实际对应项目的名称&#xff0c;就是项目根目录的名称。一般GroupID就是填com.leafive.test这样子。转载于:https://w…

【循序渐进学Python】14.数据库的支持

纯文本只能够实现一些简单有限的功能。如果想要实现自动序列化&#xff0c;也可以使用 shelve 模块和 pickle 模块来实现。但是&#xff0c;如果想要自动的实现数据并发访问&#xff0c;以及更标准&#xff0c;更通用的数据库(database)存储方式还是使用数据库。 1. Python 数据…

Foundation框架

1.框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合&#xff0c;以便使研发程序变的更容易 清除缓存&#xff0c;删除这个文件夹下的所有文件/Users/fanyafang/Library/Developer/Xcode/DerivedData 显示隐藏文件&#xff1a;defaults write com.apple.finder Ap…

ubuntu上搭建php,ubuntu10.04上搭建php网站运行环境

ubuntu 10.04下搭建php网站运行环境ubuntu 10.04下搭建php网站运行环境前提&#xff1a;要打开root权限sudo password [这里填写root密码]1、第一步安装ubuntu10.042、更新源sudo apt-get update3、安装lighttpdsudo apt-get install lighttpd安装好之后检查lighttpd是否成功启…