设计模式之单例模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
写法主要分为四大类:饿汉式,懒汉式,静态内部类,枚举
下面一个一个进行展示:

  • 1.饿汉式:在类被加载的时候,即生成了一个单例对象,缺点是没有实现懒加载,可能造成内存浪费。
//1.直接在创造时赋值
class Luzelong{
	private Luzelong(){}
    private static Luzelong lzl = new Luzelong();
    public static Luzelong getInstance(){
    	return lzl;
    }
	
}
2.静态代码块:
class Luzelong{
	private Luzelong(){}
    private static Luzelong lzl;
    static{
    	lzl = new Luzelong();
    }
    public static Luzelong getInstance(){
    	return lzl;
    }
	
}
  • 2.懒汉式:解决了恶汉式没有考虑到的懒加载问题。方法一是线程不安全的,在多线程的环境下,极有可能创建多个对象。方法二虽然是线程安全的,但加上synchronized这种重量级的锁是非常消耗性能的,实际开发用的也不多。这里强力推荐方法三,不仅线程安全,而且不怎么影响性能。
//1.线程不安全的写法
class Luzelong{
	private Luzelong(){}
    private static Luzelong lzl;
    public static Luzelong getInstance(){
    	if(lzl == null){
    		lzl = new Luzelong();
    	}
    	return lzl;
    }	
}

//2.通过加锁(synchronized)实现线程安全
class Luzelong{
	private Luzelong(){}
    private static Luzelong lzl;
    public static synchronized Luzelong getInstance(){
    	if(lzl == null){
    		lzl = new Luzelong();
    	}
    	return lzl;
    }	
}

//3.双重检测写法
class Luzelong{
	private Luzelong(){}
    private static volatile Luzelong lzl;//注意加了volatile关键字
    public static Luzelong getInstance(){
    	if(lzl == null){
    		synchronized (Luzelong.class){
    			if(lzl == null){
    				lzl = new Luzelong();
    			}
    		}
    	}
    	return lzl;
    }	
}
  • 3.静态内部类:静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时也能访问它。静态内部类有个特点–在外层类被加载的时候并不会也跟着被加载,只有在用到该内部类时才会被加载(懒加载)。所以实际开发也比较推荐这种写法。
class Luzelong{
	private Luzelong(){}
	private static class LuzelongInstance {
		private static final Luzelong lzl = new Luzelong();
	}
    public static Luzelong getInstance(){
        return LuzelongInstance.lzl ;
    }	
}
  • 4.枚举:枚举的一个重要特点就是枚举对象是唯一的,天然的单例模式。实际开发也非常推荐!
enum Luzelong{
	lzl
	...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘歌唱家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值