《Head First设计模式》之单例模式

引言

人总会有独自走一段孤独的旅程,这段旅程是孤独的,这段旅程是痛苦的,这段旅程是很困难的,只要在最困难的时候仍然不放弃努力,那么这一切都会过去,你总有一天会拨开云雾见天日,守得云开见月明。

单例模式定义

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

大家都知道“一夫一妻制”,在中国,一个男人,有且只能有一个媳妇,如果你非要找个小三,势必会增加开销,占用更多资源。所以没资本的屌丝们,劝你们,媳妇这个对象有且只能创建一个,如果你不自量力,非要整个小三出来,像某某官员,一般不会出问题,但当小三和你媳妇争夺资源的时,势必会出现致命性的bug,信不信由你?

单例模式类图

在这里插入图片描述

实现单例模式条件

通过观察上面类图可知:
1.静态的私有化字段;

	private static Singleton uniqueInstance;

2.私有构造器

	private Singleton(){
	}

3.提供公共的访问该类实例的方法.

	public static Singleton getInstance(){
		return uniqueInstance;	
	}

常见的单例模式

一、饿汉式
	/**
 *  饿汉式
 * @author Knight
 *
 */
public class Singleton {

	private static Singleton uniqueInstance = new Singleton();

	private Singleton() {
	}

	public static Singleton getInstance() {
		return uniqueInstance;
	}
}

优点:

1.线程安全 
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。
3.通过sealed修饰类,阻止派生类的出现,因为派生可能会增加实例。

缺点:

资源效率不高,可能GetInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化。
二,懒汉式
/**
 * 单例模式 确保一个类只有一个实例,并提供该实例的全局访问点。 懒汉式-线程不安全
 * 
 * @author Knight
 *
 */
public class Singletion {

	private static Singletion uniqueInstance;

	// 私有构造函数
	private Singletion() {
	}

	public static Singletion getUniqueInstance() {
		if (uniqueInstance == null) {
			uniqueInstance = new Singletion();
		}
		return uniqueInstance;
	}
}
懒汉双重校验-线程安全的
	/**
 *  懒汉式
 * @author Knight
 *
 */
public class MeSingleton {
	
	private static MeSingleton uniqueInstance;
	
	private MeSingleton(){	
	}
	/**
	 *  双重校验锁-线程安全的
	 * @return
	 */
	public static MeSingleton getInstance(){
		if(uniqueInstance == null){
			synchronized (MeSingleton.class) {
				if(uniqueInstance == null){
					uniqueInstance = new MeSingleton();
				}
			}
		}
		return uniqueInstance;
	}
	
}

懒汉式面临线程安全的问题,通过双重锁定这样的处理才可以保证安全。

测试

	public class SingletonTest {
	
	public static void main(String[] args) {
		MeSingleton singleton1 = MeSingleton.getInstance();
		MeSingleton singleton2 = MeSingleton.getInstance();
		if(singleton1 == singleton2){
			System.out.println("两个对象相同");
		}else{
			System.out.println("两个对象不一样");
		}
	}
}

结果

在这里插入图片描述

本打算创建个对象,给我买个苹果的,看来两个对象一样,也只能自己给自己买了。

总结

单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。

参考博客:https://www.cnblogs.com/wolf-sun/p/3489549.html

博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值