在Java中一共有23种设计模式,今天来讲一讲相对简单的一种设计模式——单例设计模式。
在这里要首先理解一下什么是单例。
单例的概念
在Java中,对象也被称为是实例,所以在这里的“例”说的就是对象的问题,即以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
所以可以看出,单例设计模式的一个最大特点,也就是只有一个对象可以被外部访问到,那么这就有了它的一个大致用法,当外部需要调用时,每一次得到的都是同一个对象,数据只能存在一份,这就保证了数据的唯一性。可以较大程度上阻止外部外部的不一致状态。
单例的代码实现思路
说完了概念,那接下来就该从概念入手,开始进行代码的实现了,这里建议初学者自己进行思考,先不要看下边的思路与代码,思考结束后再进行综合对比。
对于Java来说,创建一个对象需要的是使用构造方法,那为了确保外部只能拿到一个对象,那必然不能让外部获取到构造方法,否则会导致外部可以随意创建对象,也就会影响所谓的单例。
那为了让外部获取不到构造方法,我们需要把构造方法私有化,从而让我们在类的内部进行创建对象,并且把创建的对象也要私有化,否则外部把对象修改为null的时候,有可能会被Java垃圾回收系统回收,使类中没有对象,外部都无法获取。
除此之外,既然对象成了私有的,那就需要一个公开的方法去返回这个对象,让外部获取这个对象。但是又有一个新的问题出现了,没有对象,我们该如何去调用方法,这时候就该想到一点,静态方法,静态方法的调用可以使用类名来调用,那就可以使用静态方法来返回对象,从而让外部获取唯一的对象。
单例的两种常用写法
懒汉式(Lazy Singleton)
懒汉式之所以被称之为"懒",就是在于它的创建对象是相比于另一个要晚,只有在调用方法时才会创建对象,这样的好处就是占用空间晚,但是效率低。以下是代码实现
public class Singleton {
private Singleton() {}
private static Singleton single=null;
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
饿汉式(Eager Singleton)
饿汉式的"饿"体现在它的创建对象的先后上,懒汉式是后创建对象,但是饿汉式是一开始就创建了对象,从而体现它的“饿”,以下是代码实现
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
public static Singleton1 getInstance() {
return single;
}
}