Java设计模式之单例模式

说到单例模式 大家一定非常熟悉 这是最常见也是设计模式中相对简单 好理解的设计模式  今天就跟大家掰一掰单例模式:单例模式确保某个类只有一个实例  应用场景 线程池 缓存 等对象常常被设计成单例  然而单例分两种 :1:恶汉式  2:懒汉式   我们先来看下 恶汉式

public class Singleton1 {
	//1 私有化构造方法 是为了确保单例 外界不能随便 new 实例
	private Singleton1(){};
	//2 私有化 此实例 为了确保在外界 不能随便 用类名 去调用这个成员变量 我们应该另外提供方法
	private static Singleton1 instance = new Singleton1(); 
	//3 基于面向对象的封装性 我们提供 get 方法供外界调用
	public static Singleton1 getInstance(){
		return instance;
	}
}

看到上面代码 我们来说下第一步 如果不私有化构造方法 外界可以随意访问  那么这样 就没有意义  也没有做到所谓的单例,  如果你第一步忘记写了 只要开发者 不去 new 构造 还是 使用get 方法获取对象 是不影响代使用的  但是特别是在开发 框架 sdk 等 你如果少写了第一个私有化构造 这样就会出问题 程序也补严谨,关于 2 3布 注释已经非常详细 这边就不做过多赘述。

下面我们来看看 懒汉式

public class Singleton2 {
	
	private Singleton2(){};
	//我们只声明 但是不 new 实例  需要的时候再 new 
	private static Singleton2 instance;
	// 我们每次需要的时候 如果有 就直接拿  如果没有 我们才 new 
	public static Singleton2 getInstance(){
		if (instance == null) {
			instance = new Singleton2();
		}
		    return instance;
	}
}

第一步和恶汉式没什么区别 看第二步 只是在栈内存做了声明 并没有 new 实例  这样的话 加载类会快 运行的时候会慢 值一提的是 懒汉式 会有线程并发的不安全因素:下面引用慕课的评论的解释  如果两个线程 threadA和 threadB分别开始执行初始化:threadA: if (instance == null) 是真,然后进入条件区里面里面,在它还没有到初始化那一步的时候,跳到 threadB:这时(instance==null)对threadB仍然是真,于是也进入到条件区里面。接下来 threadA和threadB接下来先后执行instance = new ... 就会分别给两个线程两个不同的instance了 解决同步的问题 可以加 synchronized 同步锁

我们如何来验证 是单例的呢  见下图Java设计模式之单例模式_第1张图片

看到输出的结果 两个对象双等比较内存地址值 或者 你也可以直接把内存地址值 输出 看看是否一样 会得到@xxx 的输出,明显看出 两次拿实例都是 拿的同一个对象 


恶汉式 和 懒汉式 的区别:

恶汉式 是随着类的加载 就已经把实例加载出来了 不管你最后用还是没用 这个实例 特点就是 加载类慢 运行快  懒汉式 特点就是 加载类快 运行慢

单例模式就介绍到这里,谢谢







你可能感兴趣的:(设计模式,java设计模式)