单例模式,我曾经面试的时候,面试官问我的问题,我可以正确回答对应的原理(眼高手低的娃一般都这样,记东西记住原理就很容易搞定应用),但是当时让我直接写,我没有写出来。不过公司还是录取了我!哈哈……
单例模式,其实就是一个类的实例只有一个的意思,一般在一个系统中比较“重”的实例会采用单例模式,防止系统中都是这个类的实例,占用大量的内存资源。比如数据库连接,一般都是单例模式,一般在一些ORM框架都会对session做单例处理。其实这里容易给人一种错觉,认为这种耗费资源的类都应该采用单例,但是在实际中某些应用是不能做成单例的,比如进程、线程,但是可以采用其它方式比较线程池、连接池这样的方法(用户用完以后不销毁,而是进行标记,可以再次利用),这些都在《现代操作系统原理》书中有说,目前对很多案例记得不是很清楚了,就随便提提。
废话不多说了,讲单例吧。
单例的两个特点:1.类仅有1个实例;2.提供唯一对外的访问点。
分析:第一个条件,类仅有一个实例,也就是说类在初始化的时候应该new,并且仅仅new一次。第二个条件,也就是说类要提供一个公共的方法,让其它类能够访问,而不让其它类随意的new。
class singleton{
public static singleton onlyone = new singleton();
private singleton(){};
}
sigleton就满足了单例的要求,通过一个静态变量,当类初始化时new一个实例,然后外部只能通过singleton.onlyone来访问这个唯一的singleton(构成唯一的访问点),同时构建函数是私有,这样就无法在类外部new新的对象实例。
后来看到有拓展型的单例,但是本质都一样的。
class sigleton1{
public static sigleton1 only=null;
public static sigleton1 getInstance(){
if(only ==null){
only = new sigleton1();
}
return only;
}
private sigleton1(){};
}
这种方法俗称为“懒汉式”,也就是需要的时候再初始化。
而又有“饥汉式”,在装载的时候就已经初始化好。
class sigleton2{
public static final sigleton2 instance = new sigleton2();
private sigleton2(){};
public static sigleton2 getInstance(){
return instance();
}
}
不管类型如何变化,代码都有2个特征:1.定义静态变量,提供全局访问;2.构造函数私有。
记住单例的定义,任何拓展类型都只是在基础之上的小变化,不足记忆。
文章来自个人博客:http://nklongyi.com/