单例模式 理解,简单通透

Posted on 2015-12-04 18:10  Mr.ning  阅读(8186)  评论(2编辑  收藏  举报

一、引言

       我在博客园的个人博客是今年2月份申请的,但是到现在一片文章都没有写,都有点感觉对不起这个博客(有点装。。哈哈)。好,话不多说,这篇文章里面给大家介绍23种设计模式中的第一种设计模式——单例模式。

二、单例模式

 说到单例模式,大家的第一反应应该是——什么是单例模式。单例模式的定义,官方的定义总结起来就两句话,确保一个类只有一个实例(也就是类的对象),并且提供一个全局的访问点(外部通过这个访问点来访问该类的唯一实例)。  哈哈,是不是有点懵了,没关系,正常! 单例模式的实现其实只有两行代码,定义里面的这两句话分别对应一句代码。我在这里不解释这个定义,我们用代码来说话。我在这里新建一个控制台应用程序来给大家介绍单例模式。 看到这里大家应该能明白,单例模式的实现代码了吧。

namespace _01单例模式
{
    class Program
    {
        static void Main(string[] args)
        {
            //我们在外部通过全局访问点去访问该类的唯一实例
            Singleton s = Singleton.only;
        }
    }
    public class Singleton//单例类
    {
        //2.提供一个全局访问点(其实就是一个全局静态字段),外部可以通过该字段访问该类的唯一实例
        //因为静态字段是属于类的,所以这样可以保证只有一个实例。
        public static Singleton only = new Singleton();
        //1 将构造函数声明成私有的,这样可以确保在类的外部无法实例化该类(即在类的外部获取不到类的实例)
        private Singleton() 
        {
        }
    }
}

 

 

 

第一步:将类的构造函数生命为私有的构造函数,这样我们在外部就无法通过Singleton s = new Singleton()来实例化该,因为Private生命的成员只有在该类的内部可以访问。这样可以保证类的实例只有一个(那就是在类的内部给它实例化)。

      第二步:在类的里面声明一个公开的全局的静态字段(其实也就是提供一个全局的访问点),外部对象通过这个访问点可以拿到该类的唯一实例。切记,该字段必须声明成static静态段,如果声明成非静态字段,那在类的外部就访问不到了。因为非静态成员只能通过类的实例去访问,而我们在类的外部是无法对该类进行实例化的。

      接下来的就是第二个问题,单例模式的作用是什么呢?其实定义单例模式的定义已经给了我们答案,作用就是——使得类的一个对象成为系统中的唯一实例。说了好像和没说一样吧,举个例子你就知道他有什么好处了。一个操作系统中可以存在多个打印任务,但我们只有一个打印机,同一时间只能有一个正在工作的任务,这个时候内存中打印机的这个类就必须是单例的,否则的话就可以同时执行多个打印任务,这显然会造成错误。