GOF23设计模式学习--单例模式

单例模式
一、核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

二、应用举例:Windows中的任务管理器,Windows中的回收站,配置文件的类只有一个单例,severlet,spring中的bean等。

三、优点:由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永驻内存的方式解决。
单例模式可以在系统设置全局访问点,优化环共享资源访问。

四、常见的两种应用方式:
一般为私有构造器,提供开放的访问方法。
1.饿汉模式

Public class SingletonDemo1 {
//初始化时就立即加载,没有延时加载,天然的线程安全,调用效率高
	Private static SingletonDemo1 instance = new SingletonDemo1();

	Private SingletonDemo1(){
	}

	Public static SingletonDemo1 getInstance(){
		Return instance;
	}
}

2.懒汉式

Public class SingletonDemo2 {
//初始化时不会立即加载,延时加载,线程不安全,需要加锁同步,资源利用效率高
	Private static SingletonDemo1 instance;

	Private SingletonDemo2(){
	}

	Public static synchronized SingletonDemo2 getInstance(){
		If(instance==null)
			instance = new SingletonDemo2();
		Return instance;
	}
}

三种拓展:

3.双重检测所锁实现
这个模式将同步内容下调到if内部,提高了执行的效率,不必每次获取对象都需要进行同步,只有第一次才同步创建了以后就没必要了。

问题是由于编译器优化问题原因和JVM底层内部模型原因,偶尔会出现问题,不建议使用。
pubilc class SingletonDemo3{

	private static SingletonDemo3 instance = null;
	
	private static SingletonDemo3 getInstance() {
	if(instance == null){
		SingletonDemo3 sc;
		synchronized (SingletonDemo3.class){
			sc = instance;
			if(sc == null){
				synchronized (SingletonDemo3.class){
					if(sc == null){
					sc = new SingletonDemo3();
					}
				}
				instance = sc;
			}
		}
		return instance;
	}

	private SingletonDemo3(){
	}
}
			

4.静态内部类实现
线程安全 懒加载 并发高效调用

public class SingletonDemo4{
	private static class SingletonClassInstance{
		private static final SingletonDemo4 instance = new SingletonDemo4();
	}
	
	private SingletonDemo4(){
	}
	
	public static SingletonDemo4 getInstance(){
		return SingletonClassInstance.instance;
	}
}
	

5.枚举实现单例模式
缺点:无延迟加载

public enum SingletonDemo5{
	
	//枚举元素本身就是单例对象
	INSTANCE;
	
	public static SingletonOperation(){

	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值