就像上一节当中我们讲到的数组工具集一样,如果我们把他看作一个类,来应用,不阻止他new函数的话,这个类我们在整个过程当中我们只是用他来当一个工具。假如每次用都要new一下产生一个新对象的话,就会显得整体很浪费内存,那么能不能让这个对象在整个过程当中只产生一个实例供我们来使用呢,因为只要整个过程一个实例就够用了。
有,那就是单例设计模式。
在说单例设计模式之前,我们来看一下什么是设计模式。所谓的设计模式,就是前人在解决生活中常见问题时,抽象出来的一些思考的方法,这种思考的方法能够加快我们软件的构建速度。设计模式始源于建筑行业,我们都知道建筑行业,在建筑一个物体的时候,不可能重复的拆了盖,盖了拆。这样很费时间还有人力和物力。此时就有人再想,把成功的例子抽象出来,在建筑某一个建筑物的时候,直接利用这些成功并且有效率的方法,这样既能够保证工程顺利完成,也加快了建筑的速度,更为以后增加了复用性。同样在我们IT行业当中,也有人想到了这些方法,来解决我们软件当中最经常遇到的问题,并且抽象之为设计模式,《设计模式》这本书总共讲了23种设计模式,然而设计模式是一种思想,并且不局限于语言,比如java语言有设计模式,c、c++依然有自己的设计模式,这里强调的是一种思想,对不同的软件工程方面的问题,采取相同的思考方法,提高我们软件的开发速度还有提高代码的复用性,就尤为重要。
我们现在要讲到的单例模式就是其中的一种,那么单例模式适合解决哪些问题呢?
单例模式:保证一个类仅有一个实例,并提供访问他的全局方法节点。
思路:如果我们想让一类仅有一个实例,那么首先我们要确定他到底是否能够被new,或者被new几次。如果现在我们有一个类,我们想要让他存在一个实例的话,我们这个样子来写:
class Single { String name; Single(String name) { this.name = name; } public void say() { System.out.print("Hello World!"); } }
如果我们这个样子来写的话,我们可以像下面这样调用这个类,并且实例化他:
class SingleDemo { public static void main(String[] args) { Single s1 = new Single("Single One"); Single s2 = new Single("Single Two"); s1.say(); s2.say(); } }
很显然此时我们得到的不只是一个实例,我们得到了两个实例。那么怎么阻止其创建实例呢,这个时候我们第一个想到的就是私有化构造方法,私有化之后只能类内部的可以访问。类外部的是没法访问的。那么私有化之后又产生了另外一个问题,就是私有化了,我们外部就没办法访问到了,那么这个类此时就没有存在的意义了,怎么办呢。我们可以像先前保护成员变量那样,提供一个对外访问的方法,就提供了封装功能。那么此时还有一个问题就是,如果我们想要调用这个对外的方法,我们必须要先创建实例才可以,但是我们的类是禁止外部直接实例化的,此时我们就需要在类不需要的情况下来调用这个功能,这个时候我们就会想到static方法,因为static是先于构造而存在的,所以我们给方法加上static修饰,如果静态方法当中有变量的话,也必须是静态的,所以此时我们也要赋予成员变量name是静态的,除此之外,如果此时我们这样调用的话,仍然是可以产生多个对象,因为每次返回的对象都可以不同,所以我们想让这个保存对象的变量被static修饰,这样就保证了始终有一个实例在内存当中。
我们改写上面的为这样:
class Single { String name; private static Single s = new Single("Hello world1"); private Single(String name) { this.name = name; } public static Single getInstance() { return s; } public void say() { System.out.print(this.name); } public void setName(String name) { this.name = name; } public String getName() { return name; } } class SingleDemo { public static void main(String[] args) { Single s1 = Single.getInstance(); s1.say(); s1.setName("wocao"); Single s2 = Single.getInstance(); s2.say(); System.out.print(equal(s1,s2)); } public static Boolean equal(Single s1,Single s2) { return (s1 == s2); } }
单例设计模式也分为两种分别是:饿汉式和懒汉式,以上这种就属于饿汉式,一上来就创建对象然后返回。
懒汉式是先判断对象是否存在,如果存在就直接返回对象,否则就创建一个新的对象:
懒汉式:
class Single2 { String name; private static Single2 s ; private Single2(String name) { this.name = name; } public static Single getInstance() { if(s == null) return s = new Single("Hello world1"); else return s; } public void say() { System.out.print(this.name); } public void setName(String name) { this.name = name; } public String getName() { return name; } }
懒汉式的特点就在于,如果要返回对象,我要先判断这个对象是否存在如果存在的话,我就不创建了,如果不存在我再创建。
单例模式内存图:待续.....