how2j.cn


工具版本兼容问题
LOL里有一个怪叫大龙GiantDragon,只有一只,所以该类,只能被实例化一次


本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



16分45秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器



步骤 1 : 单例模式   
步骤 2 : 饿汉式单例模式   
步骤 3 : 懒汉式单例模式   
步骤 4 : 什么时候使用饿汉式,什么时候使用懒汉式   
步骤 5 : 单例模式三元素   
步骤 6 : 练习-单例模式   
步骤 7 : 答案-单例模式   

单例模式又叫做 Singleton模式,指的是一个类,在一个JVM里,只有一个实例存在。
步骤 2 :

饿汉式单例模式

edit
GiantDragon 应该只有一只,通过私有化其构造方法,使得外部无法通过new 得到新的实例。
GiantDragon 提供了一个public static的getInstance方法,外部调用者通过该方法获取12行定义的对象,而且每一次都是获取同一个对象。 从而达到单例的目的。
这种单例模式又叫做饿汉式单例模式,无论如何都会创建一个实例
package charactor; public class GiantDragon { //私有化构造方法使得该类无法在外部通过new 进行实例化 private GiantDragon(){ } //准备一个类属性,指向一个实例化对象。 因为是类属性,所以只有一个 private static GiantDragon instance = new GiantDragon(); //public static 方法,提供给调用者获取12行定义的对象 public static GiantDragon getInstance(){ return instance; } }
package charactor; public class TestGiantDragon { public static void main(String[] args) { //通过new实例化会报错 // GiantDragon g = new GiantDragon(); //只能通过getInstance得到对象 GiantDragon g1 = GiantDragon.getInstance(); GiantDragon g2 = GiantDragon.getInstance(); GiantDragon g3 = GiantDragon.getInstance(); //都是同一个对象 System.out.println(g1==g2); System.out.println(g1==g3); } }
步骤 3 :

懒汉式单例模式

edit
懒汉式单例模式与饿汉式单例模式不同,只有在调用getInstance的时候,才会创建实例
package charactor; public class GiantDragon { //私有化构造方法使得该类无法在外部通过new 进行实例化 private GiantDragon(){ } //准备一个类属性,用于指向一个实例化对象,但是暂时指向null private static GiantDragon instance; //public static 方法,返回实例对象 public static GiantDragon getInstance(){ //第一次访问的时候,发现instance没有指向任何对象,这时实例化一个对象 if(null==instance){ instance = new GiantDragon(); } //返回 instance指向的对象 return instance; } }
package charactor; public class TestGiantDragon { public static void main(String[] args) { //通过new实例化会报错 // GiantDragon g = new GiantDragon(); //只能通过getInstance得到对象 GiantDragon g1 = GiantDragon.getInstance(); GiantDragon g2 = GiantDragon.getInstance(); GiantDragon g3 = GiantDragon.getInstance(); //都是同一个对象 System.out.println(g1==g2); System.out.println(g1==g3); } }
步骤 4 :

什么时候使用饿汉式,什么时候使用懒汉式

edit
饿汉式是立即加载的方式,无论是否会用到这个对象,都会加载。
如果在构造方法里写了性能消耗较大,占时较久的代码,比如建立与数据库的连接,那么就会在启动的时候感觉稍微有些卡顿。

懒汉式,是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量(鉴于同学们学习的进度,暂时不对线程的章节做展开)。
使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。

看业务需求,如果业务上允许有比较充分的启动和初始化时间,就使用饿汉式,否则就使用懒汉式
步骤 5 :

单例模式三元素

edit
这个是面试的时候经常会考的点,面试题通常的问法是:

什么是单例模式?

回答的时候,要答到三元素
1. 构造方法私有化
2. 静态属性指向实例
3. public static的 getInstance方法,返回第二步的静态属性
步骤 6 :

练习-单例模式

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
使用饿汉式单例模式, 把Hero类改造成为单例模式

使用懒汉式单例模式,把Item类改造成为单例模式
步骤 7 :

答案-单例模式

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 基础总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 基础总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

1分10秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package charactor; public class Hero { private Hero() { } private static Hero instance = new Hero(); public static Hero getInstance() { return instance; } }
package property; public class Item { private Item() { } private static Item instance; public static Item getInstance() { if (null == instance) { instance = new Item(); } return instance; } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2023-05-16 构造方法私有化后就不能被继承了吗
J-JP

构造方法私有化后就不能被继承了吗




1 个答案

1cHIMPANZEE
答案时间:2023-07-28
单例模式的设计目的是确保一个类只有一个实例,并提供全局访问点以供其他对象使用。因此,在传统的单例模式中,不允许继承该类,因为继承会导致类的实例数量增多。



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2022-07-29 饿汉式的判断为空顺序
达拉崩吧班德贝迪布鲁翁

饿汉式的判断里面,为什么不是instance==null而是null==instance




8 个答案

finish
答案时间:2024-05-20
可以避免由于instance为空导致的空指针异常
可以避免由于instance为空导致的空指针异常

从入门到入狱
答案时间:2023-06-28
一样的吧

Jamshen
答案时间:2023-05-24
这是为了避免人犯错误的一种方式,正常情况下是把null放在右边,但有时候人的头脑不清晰,容易把判断符号==写成赋值符号=,就会导致程序出问题,而把null放左边会在那时候报错“你不能对null进行赋值”,从而避免犯错。

期盼明天
答案时间:2023-04-21
还是有区别的 不太记得了 只记得以实参作为判断基准 可以避免一些错误 以 已知值做基准判断 不会报(有些会报异常错误吧)错 会跟准一些吧

halax
答案时间:2022-11-15
那个是懒汉模式,饿汉模式是立即加载

我是地瓜
答案时间:2022-10-26
一样的

JYN
答案时间:2022-09-29
不都一样吗

ljbeiji
答案时间:2022-08-10
==是判断两边是否相等,相不相等和顺序有没有关系,就像数学的a=b等价于b=a 你应该是把==和=弄混了,=是赋值,把=右边的值赋给左边



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2021-11-21 为什么饿汉单例模式中的TestGiantDragon不用继承GiantDragon就可以通过调用方法实例化?
2021-10-09 建议这里的单例模式懒汉模式 使用双重null进行校验
2021-07-09 2021-7-9-AM-11-00


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 53 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 基础-类和对象-单例模式 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图