浅谈单例模式的四种写法

单例模式

定义:

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。

目的:

保证一个类只有一个实例

怎么实现?

* 内部保证实例唯一
* 限制外部的访问方式
* 不可以被外部创建

单例模式的四种写法

  1. 懒汉式单例实现
public class SLazy {
	private static SLazy instance;
	
	private SLazy() {
		System.out.println("懒汉模式单例创建成功!");
	}
	
	public static SLazy getInstance() {
		if (instance==null) {
			instance = new SLazy();
		}
		return instance;
	}
}
需要时可以直接创建单例,但是线程不安全,在多线程情况下,考虑极端情况,也许会同时创建两个实例。
  1. 饿汉式单例实现
public class SHungry {
	private static SHungry instance = new SHungry();
	
	private SHungry() {
		System.out.println("饿汉模式单例创建成功!");
	}
	
	public static SHungry getInstance() {
		return instance;
	}
}
这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
在类装载的时候就完成实例化,如果从始至终从未使用过这个实例,则会造成内存的浪费。
  1. Double Check Lock(DCL)-单例实现
public class SDCL {
	private static SDCL instance;
	
	private SDCL() {
		System.out.println("SDCL单例创建成功!");
	}
	
	public static SDCL getInstance() {
		if (instance==null) {
			synchronized (SDCL.class) {
				if (instance==null) {
					instance = new SDCL();
				}
			}
		}
		return instance;
		
	}
}
进行了两次if (singleton == null)检查,保证线程安全。
这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。
  1. Enum-单例实现
public enum Senum {
	INSTANCE;

	public void say(String s) {
		
	}
}
枚举的创建由JVM虚拟机保证,避免了多线程同步的问题。
  1. 给一个Test类看结果:
public static void main(String[] args) {
		// TODO Auto-generated method stub
		SLazy.getInstance();
		SHungry.getInstance();
		SDCL.getInstance();
		Senum s1 = Senum.INSTANCE;
  		System.out.println(s1);
}
运行结果:
懒汉模式单例创建成功!
饿汉模式单例创建成功!
SDCL单例创建成功!
INSTANCE

适用的场景

举个例子,我们打开Windows的回收站时,你只能打开一个,当你想开第二个回收站窗口时,系统并不允许。
除此之外,有时你需要频繁打开关闭回收站进行操作
上述场景,就是单例模式的应用,可以以此类推。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值