博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET设计模式实例之单例模式( Singleton Pattern)
阅读量:7047 次
发布时间:2019-06-28

本文共 3836 字,大约阅读时间需要 12 分钟。

     一、单例模式简介(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实例进行了说明。单例模式是比较常用。比较简单的设计模式

 

 

转载地址:http://twuol.baihongyu.com/

你可能感兴趣的文章
新浪微博Oauth2.0授权认证及SDK、API的使用(Android)
查看>>
vs2003反向工程到visio 以及 visio自动生成代码
查看>>
java-基础-hashcode()及其优化
查看>>
ZABBIX安装官方指南
查看>>
Joomla行业解决方案
查看>>
开发过程遇到的中文乱码问题如何解决
查看>>
《机械制造业智能工厂规划设计》——1.3 智能制造是历史发展的必然产物
查看>>
存储新品:初志科技推出E系列磁盘阵列产品
查看>>
Linux内核远程DoS漏洞CVE-2017-7618 4.10.9及以前版本均受影响
查看>>
GlassFish任意文件读取漏洞跟踪
查看>>
以用户体验为中心 从Parallels RAS 16看Parallels的差异化竞争
查看>>
PHP main/php_ini.c 模块被爆DoS漏洞 没有CVE编号 PoC已经有了
查看>>
利用Fitbit,十秒入侵PC
查看>>
达沃时代田大庆:融合存储是趋势
查看>>
绿盟科技网络安全威胁周报2017.36 Struts2远程代码执行漏洞(S2-052)CVE-2017-9805
查看>>
中国人工智能学会通讯——搜狗搜索:从搜索到问答 1.2 搜狗汪仔——具备问答能力的机器人...
查看>>
七年之痒? 可七年也会有大奖
查看>>
完整商业闭环金融手游“九点半”上线
查看>>
倍儿爽!QQ轻聊版打造纯办公体验
查看>>
大数据全栈式开发语言 – Python
查看>>