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

简介:

一、单例模式简介(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("发送MailJames Hao...");

}

3、实例运行结果

五、总结(Summary

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



本文转自灵动生活博客园博客,原文链接: http://www.cnblogs.com/ywqu/archive/2010/01/13/1646009.html ,如需转载请自行联系原作者

相关文章
|
1月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
61 0
|
1月前
|
设计模式 缓存 安全
【设计模式】单例模式:确保类只有一个实例
【设计模式】单例模式:确保类只有一个实例
23 0
|
1月前
|
设计模式 安全 Java
设计模式之单例模式
设计模式之单例模式
|
11天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
16 1
|
1月前
|
设计模式 存储 缓存
设计模式之单例模式(C++)
设计模式之单例模式(C++)
22 2
|
1月前
|
设计模式 安全 Java
Java设计模式之单例模式
在软件工程中,单例模式是一种常用的设计模式,其核心目标是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。Java作为一门广泛使用的编程语言,实现单例模式是面试和实际开发中的常见需求。
66 9
Java设计模式之单例模式
|
2月前
|
设计模式 存储 安全
【设计模式】创建型模式之单例模式(Golang实现)
【2月更文挑战第3天】一个类只允许创建一个对象或实例,而且自行实例化并向整个系统提供该实例,这个类就是一个单例类,它提供全局访问的方法。这种设计模式叫单例设计模式,简称单例模式。
34 1
|
17天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
19 0
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
2月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。