.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("发送Mail给James Hao...");
}

  3、实例运行结果

  五、总结(Summary)

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

时间: 2024-12-17 18:09:05

.NET设计模式实例之单例模式( Singleton Pattern)的相关文章

设计模式之五:单例模式(Singleton Pattern)

单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有三个要点: 点某个类只能有一个实例: 它必须自行创建这个实例 它必须自行向整个系统提供这个实例. 一些资源管理器常常设计成单例模式. C#中的单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点 实现要点: 单例模式是限制而不是改进类的创建. 单例模式一般不要支持Icloneable接口,因为这可能导致多个对象实例,与单例模式的初衷违背. 单例模式一般

设计模式之单例模式Singleton pattern

单例模式Singleton pattern 一种软件设计模式.在核心结构中只包含一个被称为单例的特殊类. 一个类只有一个对象实例,并且自行实例化向整个系统提供. 动机 一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器.如在Windows中就只能打开一个任务管理器.如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源:如果这些窗口显示的内容不

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

单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using System.Collections.Generic; using System.Text; namespace Pattern.Singleton { /// <summary> /// 泛型实现单例模式 /// </summary> /// <typeparam name=&q

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

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

ninject学习笔记二:单例模式singleton pattern

今天准备学习singleton pattern,顾单词思含义,就是一个实例的意思.单例的实现思路是:私有化构造函数,提供公有方法获取类的实例.下面定义一个音乐播放器类MusicPlayer,观察单例的实现方法 class MusicPlayer { private static readonly MusicPlayer player = new MusicPlayer(); private MusicPlayer() { } public static MusicPlayer GetInstan

&quot;围观&quot;设计模式(7)--创建型之单例模式(Singleton Pattern)

单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简化了在复杂环境下的配置管理.----维基百科(WIKIPEDIA) 个人的理解: 单例模式概念比较简单,他的目的就是只允许出现一个该类的实例,经常在JD

单例模式 (Singleton pattern)

What is Singleton pattern? In Wikipedia, there is an explanation:"In software engineering, the singleton pattern is a design pattern that restricts the instantiation of a class to one object." 一.什么是单例模式? 在维基百科中,是这样解释的,“在软件工程中,单例模式指的是对类加以限制,只允许创建

C# 单例模式(Singleton Pattern)

(新手写博客,主要是对自己学习的归纳总结.会对很多小细节详解.) 单例模式的定义: 确保一个类只有一个实例,并提供一个全局访问点. 首先实例大家应该都明白就是类生成对象的过程简单的就是String s=new String(),则s就是个实例. Q:如何只生成一个实例? A:1)首先必须将构造函数变为私有从而防止其他类实例化,并且只能有一个构造函数.因为系统会默认一个无参构造函数,而且默认public访问修饰符. 所以必须写一个私有无参让默认无效.(通常单例模式都是不带形参的) 2)在该类中声明

Python设计模式 - 创建型 - 单例模式(Singleton) - 十种

对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不想看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便了项目开发,但是单例模式本身也有一定的局限性,如果滥用则会给后续软件框架的扩展和维护带来隐患. 单例模式的实现有很多种,应用场合也各有不同,但必须保证实例唯一,如果是多线程环境则必须保证线程安全.python本身有很多内置特性可以用来实现单例模式的效果,理清每种单例模式的实现原理.优缺点及使用场合才