单例模式:保证一个类只有一个实例,同时提供访问唯一实例的方法。
模式实现思路:把创建类实例的权限收回(即构造方法私有化),让类自己本身来负责创建实例的工作,同时提供一个外部类实例访问的方法。
单例模式分为两种实现方式:饿汉模式和懒汉模式。
(1)饿汉模式:在类加载的时候就创建实例
public class Singleton {
private static Singleton singletonInstance=new Singleton(); //实例化Singleton对象
private Singleton(){} //私有化构造函数public static Singleton getSingletonInstance(){ //提供获取Singleton对象的方法
return singletonInstance;
}
}
(2)懒汉模式:等到第一次使用的时候才创建实例
public class Singleton {
private static Singleton singltonInstance=null; //定义一个Sington变量singltonInstance
private Singleton(){} //构造函数私有化
public static Singleton getSingletonInstance(){ //提供获取Singleton对象的方法
//判断singltonInstance是否为空,如果为空,则创建一个对象赋予singltonInstance,否则直接返回
if(singltonInstance == null){
singltonInstance=new Singleton();}
return singltonInstance;
}
(3)两种模式的比较
A:时间与空间
懒汉模式是典型的时间换空间,即每次在获取实例的时候,都要进行判断,是否需要创建实例,浪费时间。但,如果一直没有的时候,就不会创建实例,节省空间。
饿汉模式则是空间换时间,在类加载的时候就创建实例,每次调用的时候直接调用,不需要判断,节省时间,但如果一直没有被使用则会浪费内存空间。
B:线程安全
懒汉模式:不加同步的懒汉模式是线程不安全的。懒汉模式实现线程安全,加上Synchronized即可。
饿汉模式:是线程安全的,因为使用static,虚拟机只保证装载一次。