用最简单的例子理解单例模式(Singleton Pattern)

当从应用程序全局的角度来看,如果只允许类的一个实例产生,就可以考虑单例模式。

□ 即时加载的单例模式

把类的实例赋值给类的一个静态字段。

    class Program
    {
        static void Main(string[] args)
        {
            Logger log = Logger.GetInstance();
            log.WriteToFile();
            Console.Read();
        }
    }

    public class Logger
    {
        private static Logger logger = new Logger();
        private Logger(){}

        public static Logger GetInstance()
        {
            return logger;
        }

        public void WriteToFile()
        {
            Console.WriteLine("错误被写入文件了~~");
        }
    }




□ 延迟加载的单例模式

直到调用类的静态方法,才产生类的实例。

    public class Logger
    {
        private static Logger logger = null;
        private Logger(){}

        public static Logger GetInstance()
        {
            if (null == logger)
            {
                logger = new Logger();
            }
            return logger;
        }

        public void WriteToFile()
        {
            Console.WriteLine("错误被写入文件了~~");
        }
    }


□ 线程安全的单例模式

直到调用类的静态方法,保证只有一个线程进入产生类的实例。

   public class Logger
    {
        private static Logger logger = null;
        private static object lockObj = new object();
        private Logger(){}

        public static Logger GetInstance()
        {
            lock (lockObj)
            {
                if (logger == null)
                {
                    logger = new Logger();
                }
                return logger;
            }
        }

        public void WriteToFile()
        {
            Console.WriteLine("错误被写入文件了~~");
        }
    }


总结:静态单例类型的私有字段,私有构造函数,获取单例的方法是构成单例模式的3个必要元素。

时间: 2024-08-11 05:44:20

用最简单的例子理解单例模式(Singleton Pattern)的相关文章

用最简单的例子理解适配器模式(Adapter Pattern)

中国足球的水平虽然不高,但实际上,在每个城市会有一批足球爱好者,他们踢球.看球.懂球.有这样的2个足球爱好者,一个是左脚选手,另一个是右脚选手. public class PlayWithLeft { public void Play() { Console.WriteLine("我是左脚选手"); } } public class PlayWitRight { public void Play() { Console.WriteLine("我是右脚选手"); }

用最简单的例子理解观察者模式(Observer Pattern)

假设有一个软件公司,每当有新产品推出,就把信息通知到一些客户. 把通知这个动作抽象成一个接口. public interface IService { void Notif(); } 客户如果想获得通知,就需要实现以上的接口.这里的客户被看作是观察者. public class CustomerA : IService { public void Notif() { Console.WriteLine("客户A收到通知了~~"); } } public class CustomerB

用最简单的例子理解对象为Null模式(Null Object Pattern)

所谓的"对象为Null模式",就是要求开发者考虑对象为Null的情况,并设计出在这种情况下的应对方法. 拿"用最简单的例子理解策略模式(Strategy Pattern) "中的例子来说,在我们的客户端程序中只考虑了用户输入1,2,3的情况,如果用户输入其它数字,比如4,就没有一个对应的IBall接口实现类实例产生,于是会报如下的错: 为了应对这种情况,我们专门设计一个类,当用户输入1,2,3以上的数字,就产生该类的实例.该类同样实现IBall接口. public

设计模式之单例模式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

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

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

单例模式 (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." 一.什么是单例模式? 在维基百科中,是这样解释的,“在软件工程中,单例模式指的是对类加以限制,只允许创建

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

一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它. 二.解决的问题(What To Solve) 当一个类只允许创建一个实例时,可以考虑使用单例模式. 三.单例模式分析(Analysis)1.单例模式结构 Singleton类,定义一个私有变量instance;私有构造方法Singleton(

Swift 实现单例模式Singleton pattern的三种方法

转自:点击打开链接 From my short experience with Swift there are three approaches to implement the Singleton pattern that support lazy initialization and thread safety. These approaches might change or become redundant as the language matures. Global constant