概述
专业定义:
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
个人理解:
单例就是只有一个实例,然后到处都可以访问使用。
实现逻辑
个人自述:
首先,在单例类里面,要有一个自己类型的字段(私有静态的),用来存储自己的实例化的对象。
其次,声明一个构造函数(私有的),用来把默认的公开构造函数给顶替掉,不让这个类可以直接实例化(保证单个实例)。
最后,一个公开的静态方法,用来在不存在实例的时候创建实例并返回,已经存在实例的时候将实例返回。
简单的单例实现:(存在其他变种实现方法)
问题
- 为什么存储自己实例的字段是使用私有静态的?
答:首先静态提供一个类似全局变量的作用,私有让该变量只能被类中调用,从而让该单例的获取
只能从获取单例的公开方法中获得
- 为什么需要声明一个私有的构造函数
答:用来把默认的公开构造函数给顶替掉,不让这个类可以直接实例化(保证单个实例)。
- 为什么使用单例模式不使用静态方法
答:
从面相对象的角度讲:
虽然都能实现目的,但是他们一个是基于对象,一个是面向对象的,就像我们不面相对象也能解决问题一样,面相对象的代码提供一个更好的编程思想。
如果一个方法和他所在类的实例对象无关,那么它就应该是静态的,反之他就应该是非静态的。如果我们确实应该使用非静态的方法,但是在创建类时又确实只需要维护一份实例时,就需要用单例模式了。
比如说我们在系统运行时候,就需要加载一些配置和属性,这些配置和属性是一定存在了,又是公共的,同时需要在整个生命周期中都存在,所以只需要一份就行,这个时候如果需要我再需要的时候new一个,再给他分配值,显然是浪费内存并且再赋值没什么意义,所以这个时候我们就需要单例模式或静态方法去维持一份且仅这一份拷贝,但此时这些配置和属性又是通过面向对象的编码方式得到的,我们就应该使用单例模式,或者不是面向对象的,但他本身的属性应该是面对对象的,我们使用静态方法虽然能同样解决问题,但是最好的解决方案也应该是使用单例模式。
从功能上讲:单例模式可以控制单例数量;可以进行有意义的派生;对实例的创建有更自由的控制;
多线程时的单例
目的:对多线程进行控制,保证只有单例存在(线程安全问题)
待续(缺少多线程编程知识)