单例设计模式

岁酱吖の 提交于 2020-04-04 09:20:54

@

一、概念叙述

单例模式是一种常用的软件设计模式,使用单例模式,可以保证为一类只生成唯一的实例对象。也就是说,整个程序空间中,该类只存在一个实例对象。

二、先看个问题

我们通常在实例化对象是,通常是通过去new构造器方法获取一个类的实例化对象。这样就会出现一个问题:那就是每次创建的实例对象的内存地址都不一样。

public class Student {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

在这里插入图片描述
接下来单例模式就可以解决这个问题。

三、单例模式实现

(一)、饿汉模式

package 单例模式;
/**
 * 饿汉模式
 * 1、初始化类对象
 * 2、私有化构造器
 * 3、通过静态方法还会
 */
public class Student {
//	初始化对象,当类加载时,就已经把student对象加载到了内存中
	private static Student student = new Student();
	private String name;
//	第一步私有化构造器
	private Student() {
		
	}
//	通过静态方法返回对象
	public static Student getInstance() {
		return student;
	}
}

在这里插入图片描述
饿汉模式特点: 执行效率较高,会占用稍稍占用一点内存空间

(二)、懒汉模式

package 单例模式;
/*
 * 懒汉式
 * 1、先去创建对象
 * 2、私有化构造
 * 3、静态方法实例化对象,并返回
 * */
public class Student1 {
//	先创建对象,不去实例化对象
	private static Student1 student1 = null;
//	私有构造
	private Student1() {
		
	}
//	静态方法返回对象
	private static Student1 getInstance() {
//		当该方法被调用的时候再去实例化对象
		if(student1 == null) {
			student1 = new Student1();
		}
		return student1;
	}

}

在这里插入图片描述
懒汉模式特点: 懒汉模式不支持多线程,只支持单线程,不能保证线程的安全性

(三)、双重校验锁

双重校验锁就是解决懒汉模式不支持多线程的问题,我们来分析一下为什么懒汉模式不支持多线程!
在这里插入图片描述
双重校验锁
在这里插入图片描述
具体实现

package 单例模式;
/*
 * 双重校验锁
 * */
public class Student1 {
//	先创建对象,不去实例化对象
	private static Student1 student1 = null;
//	私有构造
	private Student1() {
		
	}
//	静态方法返回对象
	public static Student1 getInstance() {
//		当该方法被调用的时候再去实例化对象
		if(student1 == null) {
//			设置同步代码块
			synchronized (Student1.class) {
//				再一次进行判断
				if(student1 == null) {
					student1 = new Student1();
				}
			}
		}
		return student1;
	}

}
~~~![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402144821143.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDY3NjkzNQ==,size_16,color_FFFFFF,t_70)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!