| 
			
	
	
	
						  
						
						
						
	
 
	本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
	 
			 
	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公众号,关注后实时获知最新的教程和优惠活动,谢谢。
			 
			 
			
			
			
			
			
		
		
		
		 	问答区域     
		 	
				
		  
	 
	  		
	  
	  	2025-07-25
	  		
	  				
	  					 
	  
					
						答案 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  
 
		回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢	
	 
	  		
	  
	  	2023-05-16
	  		
	  				
	  					 
	  
					
						构造方法私有化后就不能被继承了吗 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  
 
1 个答案 
	 
1cHIMPANZEE 跳转到问题位置 答案时间:2023-07-28 单例模式的设计目的是确保一个类只有一个实例,并提供全局访问点以供其他对象使用。因此,在传统的单例模式中,不允许继承该类,因为继承会导致类的实例数量增多。
 
		
							
		
		
		
		
	
	
	
		回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢	
	 
	  		
	  
	  	2022-07-29
	  		
	  				
	  					 
	  
					
						饿汉式的判断为空顺序 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  	    
	    
	  
	  		
	  
	  	2021-11-21
	  		
	  				
	  					 
	  
					
						为什么饿汉单例模式中的TestGiantDragon不用继承GiantDragon就可以通过调用方法实例化? 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  	    
	    
	  
	  		
	  
	  	2021-10-09
	  		
	  				
	  					 
	  
					
						建议这里的单例模式懒汉模式 使用双重null进行校验 
					
					
						
							
						
											
							
					
					
					
	   
	  
	  
	  	    
	    
	  提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 54 条以前的提问,请 点击查看 
			
			提问之前请登陆
			
		 
		提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢	
	 
 |