单例设计模式

Posted geq2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例设计模式相关的知识,希望对你有一定的参考价值。

@

一、概念叙述

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

二、先看个问题

我们通常在实例化对象是,通常是通过去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)







以上是关于单例设计模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

从 Viewpager2 片段访问父片段函数

你熟悉的设计模式都有哪些?写出单例模式的实现代码