单例模式

Posted liaokui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

单例模式:是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

适用场合

 

  • 需要频繁的进行创建和销毁的对象;
  • 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
  • 工具类对象;

频繁访问数据库或文件的对象。

优点

  • 系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
  • 由于单例模式在内存中只有一个实例,减少了内存开销。
  • 单例模式可以避免对资源的多重占用,例如一个写文件时,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
  • 单例模式可以再系统设置全局的访问点,优化和共享资源访问。
  • 其中使用到单例模式时,考虑较多的就是多线程的情况下如何防止被多线程同时创建等问题,

 

  • 当这个类的对象在多个地方创建的时候,使得内部的方法多次调用,但是希望只要一个对象操作这个方法,或者不希望多个地方同时调用这个方法,需要保持这个方法的单一性质,就用单利模式

缺点

不合理的单例设计将导致程序编写十分麻烦。
不需要保障唯一性的对象使用单例,将会起反作用

    //通过双if 夹lock的方式,实现单例模式 
public class Singleton
    {

        public Singleton()
        {
            Console.WriteLine("创建一个对象");
        }

        private static Singleton singleton;

        private static object singletonLock = null;
    
        public static Singleton CreateInstance()
        {

            if (singleton == null)//保证初始化后的线程不需要等待锁
            {
                lock (singletonLock)
                {
                    if (singleton == null)
                    {
                        singleton = new Singleton();
                    }
                }

            }
            return singleton;
        }

        public void Show()
        {
            Console.WriteLine("单例模式");
        }
    }
}

 

  

//静态构造函数实现单利
    public class SingletonTwo
    {
        private SingletonTwo()
        {
            Console.WriteLine("创建一个对象");
        }

        private static SingletonTwo singleton = null;
        static SingletonTwo()
        {
            singleton = new SingletonTwo();
        }

        public static SingletonTwo CreateInstance()
        {
            return singleton;
        }
        public void Show()
        {
            Console.WriteLine("单例模式");
        }
    }

  

//静态变量实现单利
    public class SingletonThird
    {
        private SingletonThird()
        {
            Console.WriteLine("创建一个对象");
        }
        private static SingletonThird singleton =new SingletonThird();

        public static SingletonThird CreateInstance()
        {
            return singleton;
        }
        public void Show()
        {
            Console.WriteLine("单例模式");
        }
    }

  

// var singleton= Singleton.CreateInstance();//双if + lock 实现

//var singleton = SingletonThird.CreateInstance();//静态变量 第一次使用的时候初始化,只初始化一次

var singleton = SingletonTwo.CreateInstance();//构造函数实现单利
singleton.Show();

  

 

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块