单例模式
所谓的类的单例设计模式,就是采取一定的方法保证在整个软件系统汇总,对某个类只能存在一个对象实例,并且该类值提供一个取得其对象实例的方法。
实现单例模式需要满足三个条件:
- 单例类只能由一个实例;
- 单例类必须自己创建自己的唯一实例(及构造方法私有化);
- 单例模式必须给所有其他对象提供这一实例的获取方法;
1 饿汉式
package review.kkb;
//饿汉式
//第一步 构造方法私有化
//第二步 声明一个当前类对象 你可以直接实例化(饿汉式) 也可以在方法中实例化(懒汉式)
//第三步 声明一个静态方法 返回类型就是当前类类型 把当前类对象返回给这个方法
public class SignTon02 {
private static SignTon02 s1 = new SignTon02();
private SignTon02() {
}
public static SignTon02 getSignTon02() {
return s1;
}
public static void main(String[] args) {
SignTon02 s1 = getSignTon02();
SignTon02 s2 = getSignTon02();
System.out.println(s1 == s2);
}
}
运行结果:
true
2 懒汉式
package review.kkb;
//懒汉式
//单例模式类 只能有一个实例
//该实例还可以 其他类访问到
public class SingleTon {
//当前对象 只能本类访问 static
private static SingleTon s1 = null;
//解决第一个问题 外界访问的不能让他new对象 构造方法私有化
private SingleTon() {
}
//第二个问题 外界能访问当前类对象 每次访问都是同一个对象 书写一个方法方法的返回类型就是当前类类型
//这个方法作用就是供外界访问此方法 得到当前类对象
public static SingleTon getSingleTon() {
if(s1 == null) {
System.out.println("实例化对象了");
s1 = new SingleTon();
}
return s1;
}
}
package review.kkb;
public class Test {
public static void main(String[] args) {
SingleTon s1 = SingleTon.getSingleTon();
SingleTon s2 = SingleTon.getSingleTon();
System.out.println(s1 ==s2);
}
}
运行结果
实例化对象了
true
3 饿汉式与懒汉式的区别
- 饿汉式是类一旦加载就把单例给初始化完成,保证调用获取单例方法的时候,单例是以及存在的了;
- 懒汉式比较懒,只有当第哦啊用获取单例方法的时候,才会取初始化这个单例;
- 单从资源利用角度来说饿汉式比懒汉式稍差些,但是从速度和反应时间来说,饿汉式比懒汉式稍好些;
注意:懒汉式还存在线程安全的问题,可以使用多线程修复。