DoNet设计模式实例之单例模式( Singleton Pattern)

一 : 单例模式的简介:(Brief Introduction)

  单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。简单说就是单一模式:仅能有你一个人访问;

二、解决的问题(What To Solve)

  当一个类只允许创建一个实例时,可以考虑使用单例模式。

三.单例模式分析(Analysis

  Singleton,定义一个私有变量instance;私有构造方法Singleton()和方法GetInstance();

  私有变量instance:

  单例模式结构:

  private static Singleton instance;

  私有构造方法Singleton(),外界不能使用new关键字来创建此类的实例了。

private Singleton() {}

  方法GetInstance(), 此方法是本类实例的唯一全局访问点。

public static Singleton GetInstance()
{ //如实例不存在,则New一个新实例,否则返回已有实例
if (instance == null)
{
instance = new Singleton();
} return instance;
}

单例模式代码:

public class Singleton
{
private static Singleton instance; /// <summary>
/// 程序运行时,创建一个静态只读的进程辅助对象
/// </summary>
private static readonly object _object = new object(); /// <summary>
/// 构造方法私有,外键不能通过New类实例化此类
/// </summary>
private Singleton()
{
}
/// <summary>
/// 此方法是本类实例的唯一全局访问点
/// (双重加锁 Double-Check Locking)
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
//先判断实例是否存在,不存在再加锁处理
if (instance == null)
{
//在同一时刻加了锁的那部分程序只有一个线程可以进入,
lock (_object)
{
//如实例不存在,则New一个新实例,否则返回已有实例
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}

客户端代码:

static void Main(string[] args)
{
Singleton singleton2 = Singleton.GetInstance();
Singleton singleton3 = Singleton.GetInstance();
if (singleton2 ==singleton3)
{
Console.WriteLine("实例singleton2与实例singleton3相同!");
}
Console.ReadKey();
}

单例模式也可以不用枷锁,例如在一个类中使用三层技术调用类:

#region  获取自身的单例模式:UserInfo 代表了Bll层中的类文件

private static UserInfo instance;
public static UserInfo GetInstance()
{
if (instance==null)
{
instance = new UserInfo ();
} return instance;
} #endregion

在表示层调用:

.BLL . UserInfo   bll = BLL. UserInfo.GetInstance();

四.单例的优缺点:

优点:
   1.能保障对象的唯一性;
  2.用于读取配置文件相当合适;(因为配置文件只有一份,也只需要使用这一份);
缺点:
  1.不合理的单例设计将导致程序编写十分麻烦。
  2.不需要保障唯一性的对象使用单例,将会起反作用。

原文地址:http://www.cnblogs.com/wang-123/archive/2011/08/02/2124991.html

.net设计模式 - 单例模式的更多相关文章

  1. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  2. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

  3. c#设计模式-单例模式(面试题)

    c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...

  4. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  5. 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...

  6. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  7. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  8. java设计模式——单例模式(一)

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

  9. php实现设计模式————单例模式

    php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...

  10. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

随机推荐

  1. AVL树的插入删除查找算法实现和分析-1

    至于什么是AVL树和AVL树的一些概念问题在这里就不多说了,下面是我写的代码,里面的注释非常详细地说明了实现的思想和方法. 因为在操作时真正需要的是子树高度的差,所以这里采用-1,0,1来表示左子树和 ...

  2. var, object, dynamic的区别以及使用(转载)

    var, object, dynamic的区别以及使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 拿这三者比较的原因 ...

  3. EasyUI - Datatable转Json and Json转Datatable

    using System; using System.Data; using System.Linq; using System.Collections; using System.Collectio ...

  4. perl post 请求带参数

    my $url='https://wenjinbao.winfae.com/business/dispatch_post.do?action=submitAdminLogin';    my $res ...

  5. Koa -- 基于 Node.js 平台的下一代 web 开发框架

    http://koa.bootcss.com/ 多研究点 react 和 nodejs 这个是未来

  6. 【LeetCode从零单排】No 3 Longest Substring Without Repeating Characters

    题目 Given a string, find the length of the longest substring without repeating characters. For exampl ...

  7. 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...

  8. Indy10.2.5的危险做法

    为了排查一个Bug今天无意看了看Indy源码,结果吓了一跳.TIdIOHandler.ReadLongWord函数用于读取通讯数据并转换成LongWord类型返回,它做用了一种危险的做法可能会导致数据 ...

  9. 研究一下FBrush,它是从TWinControl才有的属性(可能是因为需要句柄)——发现{$R *.dfm}在运行期执行,而且很有深意,读到属性后赋值还会触发事件,这些无法在VCL代码里直接看到

    定义和创建: TWinControl = class(TControl) private FBrush: TBrush; end; constructor TWinControl.Create(AOw ...

  10. ALV编辑行内容有改变时候操作

    ALV编辑行内容时,调用方法 check_changed_data返回变量 gf_valid = 'X'的话说明alv行有变化. 以下拿alv维护表程序部分代码做例: DATA: gr_alvgrid ...