how2j.cn


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

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



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



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

步骤 1 :

单例模式

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

饿汉式单例模式

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 :

懒汉式单例模式

懒汉式单例模式与饿汉式单例模式不同,只有在调用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 :

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

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

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

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

单例模式三元素

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

什么是单例模式?

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

练习-单例模式

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

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

答案-单例模式

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


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公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-08-15 交作业
郭Bj



仅供参考
package demo;

/**
 * @author @Bj
 *  单例模式练习
 */
public class SingleHero {

	
	//构造方法私有化
	private SingleHero() {
		System.out.println("我已经被私有化");
	     
	}
	
	//饿汉模式,类属性直接指向实例
//	public static SingleHero hero=new SingleHero();
	
	//类方法中返回静态属性
//	public static SingleHero getHero() {
//		return hero;
//	}
	
	//懒汉模式,第一次实例化对象
	public static SingleHero hero;
	
	public static SingleHero getHero() {
		if(hero==null) {
			hero=new SingleHero();
		}
		return hero;
	}
	
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-08-12 饿汉,小白交作业
香蕉你个芭拉



饿汉
class  Hero   {
	
	private Hero;
	
	private static Hero s = new Hero();

	public static Hero getInstance()   {
		
		return s;
	}
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-08-12 小白交作业,饿汉
2018-08-06 交作业
2018-07-24 交作业
2018-07-21 没报错
2018-07-21 交作业
2018-07-13 想了解一下的单例模式的作用是什么
2018-07-06 写作业
2018-06-01 交作业呀交作业
2018-05-30 交作业--单例模式
2018-05-26 临时使用
2018-05-19 交作业
2018-05-08 作业
2018-04-27 交作业
2018-04-20 交作业-打卡
2017-12-30 类属性指向一个实例化对象是什么意思
2017-12-03 作业
2017-11-19 饿汉单例模式有问题
2017-11-04 有几个问题求解
2017-10-12 把Item改造成单列模式后,为啥之前继承类Weapon报错?
2017-09-13 小建议 专有名词请加点英文注解
2017-09-13 小建议 专有名词加英文注解
2017-05-12 为什么静态属性跟静态方法前要加上类名?
2017-02-13 关于单例模式第二步,静态属性指向实例使用public static修饰有什么区别呢
2017-02-01 类属型并不是一个类只有唯一的吗?
2017-01-19 单例模式有啥作用?
2016-12-11 代码




提问之前请登陆
关于 JAVA 基础-类和对象-单例模式 的提问

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

上传截图