Java设计模式——创建型模式之单例模式

一、前言

     今天我们来一起来进行单例模式的学习,在我们的开发中,单例模式的应用可能我们自己写代码的过程中本身会用的很少,但是这种设计模式却又是一种常见的模式,在一些jar包中可以找到它们的身影,它的出现常常会跟工厂模式一起配合使用。那么使用单例模式有什么好处呢?就用工厂模式来举例,从我们正常的认知上来讲,工厂通常只需要一个就可以,调用者不需要每次使用工厂就要New一个工厂对象,这样做不仅不合常理,更浪费了我们的内存。我们都知道,java的内存是通过JVM来分配的,内存本身就有限,而单例模式在一定程度上就可以帮助我们合理的利用我们的内存资源。所以这种设计模式通常会出现在框架中,毕竟一个好的框架肯定会合理的利用内存资源嘛,对不对?

二、单例模式

      单例模式在代码结构上比较简单,创造单例模式的方法也是多种多样,但是万变不离其宗,最终的结果都是只会有一个对象产生,它们的相同之处就是自身的构造器私有化,对象由内部方法创建,不给外部使用,外部只能都通这个类的静态方法产生这个类,这样就能做到只有一个对象产生,而区别就在于这个对象到底是在作用前产生还是作用后产生,时候考虑多线程问题。这里,小编就只介绍我们常用的三种单例模式:懒汉模式、饿汉模式、双重校验锁。这三种单例模式可以分别在不同场景下使用,下面我们来逐一解介绍这三种设计模式:

 懒汉模式:

   如代码所示,懒汉模式的重点就是在于懒汉模式在有调用这个类的静态方法的时候才会创建对象。这样做的好处就是一定程度上减少了程序的加载时间和内存使用。缺点就是在调用时才使用,那么在获取这个类的过程中肯定会花更长的时间。

/**
 * 懒汉模式
 * @author Deng
 *
 */
public class SlackerSingleton {
	//懒汉模式在使用时才赋值
private static SlackerSingleton singleton = null;
private SlackerSingleton()
{
	
}
public static SlackerSingleton getInstance()
{
	if(singleton == null)
	{
		singleton = new SlackerSingleton();
	}
	return singleton;
}
}

    饿汉模式:

     饿汉模式是将类的创建放在调用前,这样做就肯定与前面懒汉模式的优缺点相反了。

/**
 * 饿饭模式
 * @author Deng
 *
 */
public class HungrySingleton {
private static HungrySingleton singleton = new HungrySingleton();
private HungrySingleton()
{
	
}
public static HungrySingleton getInstance()
{
	return singleton;
}

}

双重校验锁:

      前面的两个都是线程不安全的单例模式,针对于多线程来讲,必须要使用线程同步来保证线程的安全,在代码中我们使用了synchronized同步块,我们在学习单例知识的时候,有些资料使用的是同步方法来实现的,这样做使我们的这个方法加上了同步锁,相比于这种同步块来讲,性能方便可能会低于同步块这种方式,所以小编这里推荐大家使用同步块的方式来加锁。接下来我们来讲这种双重锁的原理,这时候我们会有一个疑问,明明是一个同步块我们为什么会叫双重锁呢?我们来理清一下代码逻辑,当调用多线程的时候,在这个过程中可能会有几个线程同时进入第一个if判断,这个时候我们不可能保证在加了锁之后同步块中只会出现一个调用者,所以在同步块中再加一个if判断。同步块校验一次,同步块里面的if再校验一次,这样就能保证我们的对象只创建了一次。双重校验的方式很明显会严重降低我们的系统性能,所以我们在使用这种单例模式的时候,一定要慎用。

/**
 * 双重校验锁
 * @author Deng
 *
 */
public class LockSingleton {
	//双重校验锁
private static LockSingleton singleton = null;
private LockSingleton()
{
	
}
public static LockSingleton getInstance()
{
	if(singleton == null)
	{
		synchronized (SlackerSingleton.class) {
			if(singleton == null)
			{
				singleton = new LockSingleton();
			}
		}
	}
	return singleton;
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值