C#设计模式-单实例
单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。
1.经典的模式
namespace singleClass
{
class OnlyOneClass
{
private OnlyOneClass() { }
private static OnlyOneClass instance;
public static OnlyOneClass getInstance() {
if (instance == null) {
instance = new OnlyOneClass();
return instance;
}
return instance;
}
}
}
分析一下:
1)通过私有化构造函数,使该类被调用的时候不能通过new来实现
2)定义一个静态变量类,它的生命周期和程序的生命周期是一样的,通过该静态变量来保存该类的实例
2)通过一个静态方法来实例化自己,并返还实例化后的结果,因为该方法先检查全局的实例,再判断是否再创建,保证只有一个实例
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
但是,这种方式如果碰到了多线程并发,问题就来了,如A,B两个线程同时访问了这个类,第一次检查时候都是null,会出现两个同时建立自己实例情况,这样就违背单实例模式的原则
改进一下后:
2.俗称懒汉模式
namespace singleClass
{
class OnlyOneClass
{
private OnlyOneClass() { }
public string thisname;
private static OnlyOneClass instance;
private static object _lock = new object();
public static OnlyOneClass getInstance() {
if (instance == null) {
lock (_lock)
{
if (instance == null)
{
instance = new OnlyOneClass();
return instance;
}
}
}
return instance;
}
}
}
解析:
1)声明一个object 变量,作为lock对象
2)先判断instance的变量是否为null,如果不为null也就不用lock了,直接返回实例
3) 如果是null,锁定对象,继续判断是否为null,以防有其他线程在lock前已经新建了实例,lock后可以保证在一个线程内操作
3.饿汉模式
class HungerClass{
private HungerClass() { }
private readonly static HungerClass instance=new HungerClass ();
public static HungerClass getInstance(){
return instance;
}
}
可以看出这种模式是在类初始化后就已经实例化了instance,不同于上面的懒汉模式时在调用getInstance()方法后实例化。
这种方式下,线程安全的问题将交给CLR。
4.测试
演示一下,通过声明两个OneClass类,只一个对其的thisname赋值,然后输出这两个类的thisname,看看另一个会怎样
class Program
{ static void Main(string[] args)
{
Console.WriteLine("Get a instanc from OnlyOneClass!");
try {
OnlyOneClass one = OnlyOneClass.getInstance();//one 第一个类的变量 Console.WriteLine(one.ToString()); while(true){
string ins = Console.ReadLine();
if (ins != "") { one.thisname = ins; }//只对one实例的thisname赋值
OnlyOneClass two = OnlyOneClass.getInstance();//two 第二个类的变量
Console.WriteLine(one.thisname +" one");//输出 one实例的thisname
Console.WriteLine(two.thisname +" two"); //输出 two实例的thisname
Thread.Sleep(1000);
}
}
catch (Exception e) {
Console.WriteLine(e.Message);
} Console.ReadKey();
}
}
}
可以看到这两个实例都来自一个实例。
C#设计模式-单实例的更多相关文章
- 深入浅出单实例Singleton设计模式
深入浅出单实例Singleton设计模式 陈皓 单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在整个系统 ...
- 8.2 GOF设计模式一: 单实例模式 SingleTon
GOF设计模式一: 单实例模式 SingleTon 整个美国,只有一个“现任美国总统” 比如,在学校,“老师”,有数百个:“校长”,只有一个 系统运行时,如何保证某个类只允许实例化一个对象 ...
- 设计模式之单实例模式(Singleton)
原理:将类的构造函数由pubic变为private或者protect,添加获取对象的public 成员函数,返回指向对象的静态指针. 首先来一段简单的代码实现 代码一 class Singleton ...
- 单实例Singleton
单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在 整个系统中只能出现一个类的实例.这样做当然是有必然的, ...
- Java中的单实例
前几天刚学完单实例设计模式,今天看代码时发现一行代码很奇怪,getRuntime()函数的返回类型怎么是它本身,忽然想起前几天学的单实例模式,于是找到方法的定义,果然是静态私有变量,获取实例的公有方法 ...
- 利用golang优雅的实现单实例
平时编写代码过程中,经常会遇到对于全局角度只需运行一次的代码,比如全局初始化操作,设计模式中的单例模式.针对单例模式,java中又出现了饿汉模式.懒汉模式,再配合synchronized同步关键字来实 ...
- Linux平台oracle 11g单实例 + ASM存储 安装部署 快速参考
操作环境:Citrix虚拟化环境中申请一个Linux6.4主机(模板)目标:创建单机11g + ASM存储 数据库 1. 主机准备 2. 创建ORACLE 用户和组成员 3. 创建以下目录并赋予对应权 ...
- Oracle 11.2.0.4单实例打PSU,OJVM PSU补丁快速参考
写在前面: 1.Oracel打每个补丁的操作有时存在差异,所以不管多熟悉,都应该在打任何补丁之前阅读新补丁中附带的readme. 2.Oracle每季度都会更新一个最新的PSU,本文最新指的是当前最新 ...
- oracle 11.2.0.4单实例文件系统安装与补丁
[TOC] 一,预安装处理 1.版本准备 操作系统:RHEL 6.5 数据库版本:Oracle 11.2.0.4 相关包:p13390677_112040_Linux-x86-64_1of7.zip ...
随机推荐
- vue 项目中 自定义 webpack 的 配置文件(webpack.config.babel.js)
webpack.config.babel.js,这样命名是想让webpack在编译的时候自动识别es6的语法,现在貌似不需要这样命名了,之前用webpack1.x的时候貌似是需要的 let path ...
- Centos6.8 下 Node.js 的安装
思路:采用编译好的文件进行安装 一 使用 wget 下载 到 Node.js 官网(https://nodejs.org/en/download/) 选择要下载的编译版本(Source Code) / ...
- 使用CSS3实现响应式标题全屏居中和站点前端性能
要实现标题全屏居中(同一时候在垂直和水平方向居中).有若干种方法,包含使用弹性布局.表格单元.绝对定位和自己主动外边距等. 全屏居中 当中眼下比較流行也比較easy理解的方法是使用绝对定位+偏移实现. ...
- Codeforces Round #297 (Div. 2) 525C Ilya and Sticks(脑洞)
C. Ilya and Sticks time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- [ci]项目规划-后续
几个方面来写 1,搭建gitlab 配邮箱 域名等使之好用 2,搭建jenkins –yum,安装常见插件 3,搭建sonar,汉化 4,安装sonar-scanner 0,实现sonar ...
- OA项目之权限设计②
1.接着昨天的今天到了设计怎样成功的实现权限分配的功能,首先我们看下这些功能的过程例如以下图: 首先是从user的list页面看到设置权限的button,点击进去进入设置权限的页面 进入设置权限页面, ...
- C# 泛型 default()方法
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T: T 是引用类型还是值类型. 如果 T 为值类型,则它是数值还是结构. 给定参数化类型 T 的一个变量 t ...
- htm5 俄罗斯方块
<!DOCTYPE html> <html manifest="tetris.manifest"> <!--在HTML标签里manifest=”cac ...
- easyui最简单的左右布局实现,及tab的右键菜单实现
发现最近有些人问用JQuery easyui要怎么实现左右结构的布局.就是点击左边的菜单在右边的tab中打开.其实easyui要实现这种布局很简单,只需要简单的几行代码就ok了. 特意做了一个小小的d ...
- html中div获取焦点,去掉input div等获取焦点时候的边框
经测试只有在IE chrome才会在获取焦点时有边框 使用CSS div{ outline:none; } DIV焦点事件详解 --[focus和tabIndex] 摘自:http://my.osc ...
