单例设计模式,顾名思义就是指一个类只允许产生一个实例化对象。
- 单例模式的核心问题就是如何限制对象的产生个数???
- 我们都知道对象的产生是通过构造方法产生的。如果构造方法用
public
修饰的话在类的外部就会产生无数的对象,那么第一步就是先将构造方法私有化。 - 构造方法都私有化之后类的外部一个对象都不会产生了,而我们想要的是只产生一个对象。此时类的外部已经不可能产生对象了,那么我们就应该想到在类的内部提供一个已经实例化好的对象。而所有的普通属性必须在有实例化对象的时候才能进行内存空间的分配,而现在外部无法产生实例化对象,所以必须想一个办法,可以在单例类没有实例化对象产生的时候,也可以将属性进行使用。此时,联想到使用
static
关键字。 - 目前虽然可以取得单例类的实例化对象,但是由于类中属性是由
private
进行封装的,所以要想取得private属性,应该提供getter()
方法。由于此时访问的是static属性,并且这个类无法在外部提供实例化对象,因此应该提供一个static的getter()方法,因为static方法也不受对象实例化控制,在类的外部可以直接通过类名称调用。
饿汉式单例:
class Singleton {
private static final Singleton singleton = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return singleton;
}
}
public class Test {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}
结构:
① 构造方法私有化,使得该类的外部彻底没有对象。
② 单例类内部提供一个产生好的静态(static final
) 对象。
③ 单例类内部提供一个静态方法返回唯一的一个对象,在类的外部直接通过类名称调用。
懒汉式单例:
class Singleton {
private static final Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
- 饿汉式单例上来就new,懒汉式单例用时再new。(要写就写饿汉式单例,懒汉式单例存在线程安全问题)