定义
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称之为单例类。
特点
单例类只能有一个实例;
单例类必须自己创建自己的唯一实例;
单例类必须给所有的其他对象提供这一实例。
饿汉模式:
/*
* 单例模式Singleton
* 应用场合:有些对象只需要一个就足够了,如古代皇帝、老婆
* 作用:保证整个应用程序中某个实例有且只有一个
* 类型:饿汉模式、懒汉模式
*/
public class Singleton {
//1.将构造方法私有化,不允许外部直接创建对象
private Singleton(){
}
//2.创建类的唯一实例,使用private static修饰
private static Singleton instance=new Singleton();
//3.提供一个用于获取实例的方法,使用public static修饰
public static Singleton getInstance(){
return instance;
}
}
在这个类被加载时,静态变量instance会被初始化,此时类的私有构造函数被调用,这时,单例类的唯一实例被创建。
饿汉式其实是一种比较形象的称谓。既然饿,那么在创建对象实例的时候就比较着急,饿了嘛,于是在装载类的时候就创建对象实例
private static Singleton instance=new Singleton();
饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间 缺点:浪费空间,用不用都创建出来了
优点:不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间
懒汉模式:
/*
* 懒汉模式
* 区别:饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全
* 懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢,线程不安全
*/
public class Singleton2 {
//1.将构造方式私有化,不允许外边直接创建对象
private Singleton2(){
}
//2.声明类的唯一实例,使用private static修饰
private static Singleton2 instance;
//3.提供一个用于获取实例的方法,使用public static修饰
public static Singleton2 getInstance(){
if(instance==null){
instance=new Singleton2();
}
return instance;
}
}
懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。
懒汉式其实是一种比较形象的称谓。既然懒,那么在创建对象实例的时候就不着急。会一直等到马上要使用对象实例的时候才会创建,因此在装载对象的时候不创建对象实例。
private static Singleton2 instance;
懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。
由于懒汉式的实现是线程安全的,这样会降低整个访问的速度,而且每次都要判断。
缺点:浪费时间,懒汉式的实现是线程安全的,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。
优点:如果一直没有人使用的话,那就不会创建实例,则节约内存空间。
public class Test {
public static void main(String[] args) {
//饿汉模式
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
if(s1==s2){
System.out.println("s1和s2是同一个实例");
}else{
System.out.println("s1和s2不是同一个实例");
}
//懒汉模式
Singleton2 s3=Singleton2.getInstance();
Singleton2 s4=Singleton2.getInstance();
if(s3==s4){
System.out.println("s3和s4是同一个实例");
}else{
System.out.println("S3和s4不是同一个实例");
}
}
}