一、单例模式简介(Brief Introduction)

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

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

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

三、单例模式分析(Analysis)

1、单例模式结构

 

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;

}

2、代码

1、单例模式类Singleton

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;

}

}

2、客户端代码

static void Main(string[] args)

{

Singleton singleton1 = Singleton.GetInstance();

Singleton singleton2 = Singleton.GetInstance();

if (singleton1 ==singleton2)

{

Console.WriteLine("实例singleton1与实例singleton2相同!");

}

Console.ReadKey();

}

3、实例运行结果

四.实例分析(Example)

1、场景

Mail发送机制中,需要对已经发送的消息做Log。同一时间内只允许一个进程对Txt文档进行操作,此时使用单例模式比较合适。结构如下图所示

WriteMailLog(string message) 方法:纪录Mail发送日志到文件.

_helper 、_fileLock:程序运行时,创建2个静态只读的进程辅助对象

2、代码

1、类MailLog

public class EmailLog

{

private static object _helper = new object();

private static EmailLog _instance;

private static object _fileLock = new object();

private EmailLog()

{}

public static EmailLog GetInstance()

{

lock (_helper)

{

if (_instance == null)

{

_instance = new EmailLog();

}

}

return _instance;

}

/// <summary>

/// 发送Mail日志

/// </summary>

/// <param name="message">信息</param>

public void WriteEmailLog(string message)

{

string filePath = System.AppDomain.CurrentDomain.BaseDirectory +"mail.txt";

StreamWriter sw = null;

FileStream fs = null;

lock (_fileLock)

{

if (!File.Exists(filePath))

{

fs = System.IO.File.Create(filePath);

sw = new StreamWriter(fs, Encoding.UTF8);

sw.WriteLine("--------------------------------------------------------------------------");

sw.WriteLine(message);

sw.Flush();

sw.Close();

}

else

{

fs = new FileStream(filePath, FileMode.Append);

sw = new StreamWriter(fs, Encoding.UTF8);

sw.WriteLine("--------------------------------------------------------------------------");

sw.WriteLine(message);

sw.Flush();

sw.Close();

}

}

}

}

2、客户端代码

static void Main(string[] args)

{

EmailLog w1 = EmailLog.GetInstance();

w1.WriteEmailLog("发送Mail给灵动生活...");

EmailLog w2 = EmailLog.GetInstance();

w2.WriteEmailLog("发送Mail给James Hao...");

}

3、实例运行结果

五、总结(Summary)

本文对单例模式(Singleton Pattern)的概念及其设计结构图简单地进行了描述,同样也以一个Mail机制的LOG实例进行了说明。单例模式是比较常用。比较简单的设计模式。

转载自:http://www.cnblogs.com/ywqu/archive/2010/01/13/1646009.html

Net设计模式实例之单例模式( Singleton Pattern)的更多相关文章

  1. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  2. 设计模式系列之单例模式(Singleton Pattern)

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.这种模式涉及到一个单一的类,该类负责创建自己的对象 ...

  3. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  4. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  5. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  6. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  7. 二十四种设计模式:单例模式(Singleton Pattern)

    单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...

  8. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  9. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

随机推荐

  1. EF遇到的一些问题

    环境:EntityFramework 版本号:4.1.0.0 问题一:“数据读取器与指定的“.......”不兼容.某个类型为“...”的成员在同名的数据读取器中没有对应的列.”. 使用方式:rep. ...

  2. 一道关于Promise应用的面试题

    题目:红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次:如何让三个灯不断交替重复亮灯?(用Promse实现) 三个亮灯函数已经存在: function red(){ console.log('red') ...

  3. Guava库介绍之集合(Collection)相关的API

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  4. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析

    前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...

  5. Go语言实战 - revel框架教程之权限控制

    一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...

  6. Android开发学习之路-RecyclerView使用初探

    在进行一些MaterialDesign规范开发的时候,比如之前说到的CoordinateLayout实现的向上折叠效果的时候,如果依然使用ListView,那么这种效果是做不出来的,因为ListVie ...

  7. hibernate注解方法使用总结(转)

    原博文地址:http://blog.sina.com.cn/s/blog_935ebb670101dnre.html 1.类级别注解 @Entity     映射实体类 @Table    映射数据库 ...

  8. C#设计模式-装饰者模式

    在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).Access ...

  9. react9 生命周期

    <body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...

  10. android studio sdk 不能更新

    网上看到好多sdk不能更新的,解决办法基本上一下,试了下大都没用,,有人说改hosts ,我试了 貌似没用 下面是我亲测可以更新的一种方法:使用镜像地址更新 步骤: 1. 打开 SDK Manager ...