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

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

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

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

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

  三、单例模式分析(Analysis)1、单例模式结构

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

  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、实例运行结果

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

  四.实例分析(Example)1、场景

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

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

  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、实例运行结果

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

  五、总结(Summary)

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

 

 

相关文章
|
25天前
|
设计模式 存储 安全
设计模式2:单例模式
单例模式是一种创建型模式,确保一个类只有一个实例,并提供全局访问点。分为懒汉式和饿汉式: - **懒汉式**:延迟加载,首次调用时创建实例,线程安全通过双重检查锁(double check locking)实现,使用`volatile`防止指令重排序。 - **饿汉式**:类加载时即创建实例,线程安全但可能浪费内存。 示例代码展示了如何使用Java实现这两种模式。
17 4
|
9天前
|
设计模式 安全 Java
设计模式:单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。它通过私有化构造函数、自行创建实例和静态方法(如`getInstance()`)实现。适用于数据库连接池、日志管理器等需要全局唯一对象的场景。常见的实现方式包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。线程安全问题可通过`synchronized`或双重检查锁解决,同时需防止反射和序列化破坏单例。优点是避免资源浪费,缺点是可能增加代码耦合度和测试难度。实际开发中应优先选择枚举或静态内部类,避免滥用单例,并结合依赖注入框架优化使用。
|
3月前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
106 13
|
3月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
45 2
|
4月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
66 4
|
4月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
4月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
38 0
|
3月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
6月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
90 7
|
6月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
128 0

热门文章

最新文章