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 ...
随机推荐
- oracle data file header replace(測)
SQL> create tablespace rm_tbs datafile 'f1.dbf' size 10m; Tablespace created. SQL> select file ...
- 【Java】Java_13 分支结构
Java中常见的两种分支结构: <1>If语句:使用布尔表达式或者布尔类型值作为分支条件来进行分支控制. <2>switch语句:对多个整形值进行匹配,从而实现分支控制. 1. ...
- C语言学习笔记(二) 基础知识
数据类型 C语言数据可以分为两大类: 基本类型数据和复合类型数据: 基本类型数据 整数 整型 (int) ——占4字节 短整型(short int) ——占2字节 长整型(long in ...
- Hyperlynx仿真学习
转: 1.Hyperlynx 仿真模型讲解 2.Hyperlynx使用心得 3.https://blog.csdn.net/xyh627733894/article/details/78526725 ...
- Xcode, does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE) 解决办法
在Build Settings中找到Enable Bitcode项,设置为如下: 参考:http://blog.csdn.net/soindy/article/details/48519363
- Verilog HDL test bench 문법에 관한
16bit ripple carry adder test bench `timescale 1ns/1ns module testbench2; reg [15:0] a, [15:0] b, c_ ...
- 使用sklean进行多分类下的二分类
#coding:utf-8 import matplotlib.pyplot as plt import numpy as np from sklearn.linear_model import Lo ...
- cf #363 b
B. One Bomb time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- c#的bug?
在群里面有人提出了这么一个诡异的问题,请问15.5%3.1=? 然后,我就去看了看,因为他们说结果是3.1!!!
- OC-1-面向对象
课程要点: C语言是一种面向过程的语言,OC是一种面向对象的语言 类与对象的关联 如何在xcode中创建一个类 如何在类中标记该类事物的属性和动作 C语言是一种面向过程的语言,OC是一种面向对象的语言 ...
