单例模式
有些对象我们只需要一个,比如:配置文件、工具类、线程池、缓存、日志对象等
如果创建多个实例,就会导致许多问题,比如占用过多资源,不一致 的结果等.
两种机制 : 懒汉模式 饿汉模式
类只要调用其他类的构造方法就能创建多个其他类
但是单例模式只允许外部创建一个实例:
1、饿汉模式机制:
Singleton.java:package com.zy;
/*
* 饿汉模式
*/
public class Singleton {
//饿汉模式:第二步中static修饰,不管外部是否调用,类成员随类加载而创建,已经存在一个类实例
//总是处于饥饿状态
//1.将构造方法私有化,不允许外部直接创建对象
private Singleton(){
}
//2.自己调用私有方法创建类的唯一实例,private static修饰,类的静态私有成员(封装)
private static Singleton instance = new Singleton();
//3.提供一个用于获取实例的方法,添加static变成类所有,而不是对象方法,public static修饰
public static Singleton getInstance() {
return instance;
}
}
2、懒汉模式机制:
package com.zy;
/*
* 懒汉模式
*/
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;
}
}
测试类:(Test.java)
package com.zy;
public class Test {
public static void main(String[] args) {
// 饿汉模式
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1 == s2) {
System.out.println("同一个实例");
} else {
System.out.println("不同实例");
}
// 懒汉模式
Singleton2 s3 = Singleton2.getInstance();
Singleton2 s4 = Singleton2.getInstance();
if (s3 == s4) {
System.out.println("同一实例");
} else {
System.out.println("不同实例");
}
}
}
两种机制的对比:
饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全懒汉模式的特点是加载类时比较快,但运行时获取对象速度比较慢,线程不安全