单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
一、懒汉模式
instance实例在运行时构造,类加载时不构造。所以类加载快,运行时获取对象速度较慢,缺点是不是线程安全的。
public class Singleton {
public static void main(String[] args)
{
//创建Singleton对象不能通过构造器,只能通过getInstance方法
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
//将输出true
System.out.println(s1 == s2);
}
//使用一个变量来缓存曾经创建的实例
private static Singleton instance;
//将构造器使用private修饰,隐藏该构造器
private Singleton(){
System.out.println("Singleton被构造!");
}
//提供一个静态方法,用于返回Singleton实例
//该方法可以加入自定义的控制,保证只产生一个Singleton对象
public static Singleton getInstance()
{
//如果instance为null,表明还不曾创建Singleton对象
//如果instance不为null,则表明已经创建了Singleton对象,将不会执行该方法
if (instance == null)
{
//创建一个Singleton对象,并将其缓存起来
instance = new Singleton();
}
return instance;
}
}
二、饿汉模式
instance在类加载时便构造,所以类加载较慢,运行时使用instance很快,且是线程安全的。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
/**
* @param args
*/
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
if (singleton1 == singleton2) {
System.out.println("是同一个对象");
} else {
System.out.println("不是同一个对象");
}
}
public static Singleton getInstance() {
return instance;
}
}
单例模式的用途就是为了创造一个唯一的对象,比如线程池、工具类等等