白话-23种设计模式4-单例模式
【摘要】 一、白话 单例模式是被知晓最多的模式,无外乎简单。理解也是一样,无外乎就是生成一个独一无二的东西,不管谁来,什么时候来,只能拿到同一个东西。例如银行账号,不管你取了几次钱,什么时候去取,始终都是那个账号,不会说你往这个账号存了两次钱,下一次去取,你是从其他账号取出来的。身份证这些也是一样的,不管你有多少张身份证,都是绑定你这个人,你这个人是独一无二的,无论何时何地,你都只有一个,所以绑定身...
一、白话
单例模式是被知晓最多的模式,无外乎简单。理解也是一样,无外乎就是生成一个独一无二的东西,不管谁来,什么时候来,只能拿到同一个东西。例如银行账号,不管你取了几次钱,什么时候去取,始终都是那个账号,不会说你往这个账号存了两次钱,下一次去取,你是从其他账号取出来的。身份证这些也是一样的,不管你有多少张身份证,都是绑定你这个人,你这个人是独一无二的,无论何时何地,你都只有一个,所以绑定身份证,数据户口里面只有一个你,不管你是在哪个派出所办理的绑定。
二、定义
单例模式基本定义:程序运行时,在java虚拟机中只存在该类的一个实例对象。
懒汉模式、饿汉模式:区别无外乎是否初始化。
饿汉模式:进行初始化、安全。但是浪费内存
懒汉模式:不进行初始化、不安全。因为不安全,所以需要额外进行管控,目前最安全的设计莫过于volatile + 双重锁判定。
三、示例
/**
* 饿汉模式
*/
public class Hungry {
// 程序启动即加载,static全局通用
private static Hungry hungry = new Hungry();
private Hungry() { // 隐藏构造函数,禁止再次改造
}
// 统一对外接口
public static Hungry getInstance() {
return hungry;
}
}
/**
* 懒汉模式
*/
public class Lazy {
// 不初始化,volatile保证变量的可见性,防止操作指令重排序
private static volatile Lazy lazy;
private Lazy(){ // 隐藏构造器,防止多次构造
}
public static Lazy getInstance() {
if (lazy == null) { // 双重判断 + 锁
synchronized (Lazy.class) {
lazy = new Lazy();
}
}
return lazy;
}
}
public class SingletonApplication {
public static void main(String[] args) {
Hungry hungry1 = Hungry.getInstance();
Hungry hungry2 = Hungry.getInstance();
System.out.println("Hungry 是否相等" + (hungry1 == hungry2));
Lazy lazy1 = Lazy.getInstance();
Lazy lazy2 = Lazy.getInstance();
System.out.println("Lazy 是否相等" + (lazy1 == lazy2));
}
}
输出结果:
四、总结
优点:可以确保所有对象访问唯一示例。一个实例减少性能开销,只需要唯一对象的特殊场景支持。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)