本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
16分45秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 步骤 1 : 单例模式 步骤 2 : 饿汉式单例模式 步骤 3 : 懒汉式单例模式 步骤 4 : 什么时候使用饿汉式,什么时候使用懒汉式 步骤 5 : 单例模式三元素 步骤 6 : 练习-单例模式 步骤 7 : 答案-单例模式
单例模式又叫做 Singleton模式,指的是一个类,在一个JVM里,只有一个实例存在。
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);
}
}
懒汉式单例模式与饿汉式单例模式不同,只有在调用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);
}
}
饿汉式是立即加载的方式,无论是否会用到这个对象,都会加载。
如果在构造方法里写了性能消耗较大,占时较久的代码,比如建立与数据库的连接,那么就会在启动的时候感觉稍微有些卡顿。 懒汉式,是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量(鉴于同学们学习的进度,暂时不对线程的章节做展开)。 使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。 看业务需求,如果业务上允许有比较充分的启动和初始化时间,就使用饿汉式,否则就使用懒汉式
这个是面试的时候经常会考的点,面试题通常的问法是:
什么是单例模式? 回答的时候,要答到三元素 1. 构造方法私有化 2. 静态属性指向实例 3. public static的 getInstance方法,返回第二步的静态属性
使用饿汉式单例模式, 把Hero类改造成为单例模式
使用懒汉式单例模式,把Item类改造成为单例模式
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
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
构造方法私有化后就不能被继承了吗
1 个答案
1cHIMPANZEE 跳转到问题位置 答案时间:2023-07-28 单例模式的设计目的是确保一个类只有一个实例,并提供全局访问点以供其他对象使用。因此,在传统的单例模式中,不允许继承该类,因为继承会导致类的实例数量增多。
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2022-07-29
饿汉式的判断为空顺序
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 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|