zoukankan      html  css  js  c++  java
  • 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实例进行了说明。单例模式是比较常用。比较简单的设计模式。

  • 相关阅读:
    3星|《土地制度与中国发展》:建国以来土地政策研究与分析,数据有点旧,观点都见过
    3星|《AI极简经济学》:AI的预测、决策、战略等方面的应用案例介绍
    4星|《哈佛商业评论》2018年第12期:海尔取消科层制比较成功
    房企大裁员;争议贺建奎;破产阴影下的ofo:4星|《财经》第29期
    3星|《数据资本时代》:数据会导致资本贬值,缺数据和实例证明
    3星|徐远《城里的房子》:国内一线城市核心区域的房价还会持续上涨
    5星|《伟大创意的诞生:创新自然史》:开放连接意外错误催生创意
    2星|《流量营销》:微信营销资料汇编,缺乏实战经验
    4星|《对赌:信息不足时如何做出高明决策》:赌徒概率思维最优
    5星|《大江大河》:改革开放前30年的商海故事(严重剧透)
  • 原文地址:https://www.cnblogs.com/ywqu/p/1646009.html
Copyright © 2011-2022 走看看