概念
单例模式(Singleton Pattern
)是 Java 中最简单的设计模式之一。这种设计模式属于创建型模式。保证一个类仅有一个实例,并提供一个访问它的全局访问点。常用的有饿汉式和懒汉式两种。
单例模式一般体现在类声明中,单例的类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
优点
在内存里只有一个实例,减少了内存的开销,避免对资源的多重占用。
实现方式
一个类的对象的产生是由类构造函数来完成的。如果一个类对外提供了public
的构造方法,那么外界就可以任意创建该类的对象。所以,如果想限制对象的产生,一个办法就是将构造函数变为私有的(至少是受保护的),使外面的类不能通过引用来产生对象。同时为了保证类的可用性,就必须提供一个自己的对象以及访问这个对象的静态方法。
饿汉式
饿汉,这是一个比较形象生动的比喻。对于一个饿汉来说,他希望他想要用到这个实例的时候就能够立即拿到,而不需要任何等待时间。所以,通过static
的静态初始化,在该类第一次被加载时,就有一个Singleton的实例被创建出来了。这样在第一次想要使用该对象时,他已经被初始化好了。
//code1
public class Singleton {
//在类内部实例化一个实例
private static Singleton instance = new Singleton();
//私有的构造函数,外部无法访问
private Singleton(){
}
//对外提供获取实例的静态方法
public static Singleton getInstance(){
return instance;
}
}
代码测试:
//code2
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1==singleton2);
}
}
输出结果
true
懒汉式
懒汉,有点懒,就是不会提前把实例创建出来,将类对自己的实例化延迟到第一次被引用的时候。getInstance
方法的作用是希望该对象在第一次被使用的时候被new
出来。
//code3
public class Singleton2 {
//定义实例
private static Singleton2 instance;
//私有构造方法
private Singleton2(){
}
//对外提供获取实例的静态方法
public static Singleton2 getInstance(){
//在对象被使用的时候才实例化
if(instance == null){
instance = new Singleton2();
}
return instance;
}
}
代码测试:
//code4
public class SingletonTest {
public static void main(String[] args) {
Singleton2 singleton1 = Singleton2.getInstance();
Singleton2 singleton2 = Singleton2.getInstance();
System.out.println(singleton1==singleton2);
}
}
输出结果:
true