设计模式--单例模式

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。

实现思路:为了实现该singleton2只产生一个实例化对象,可以先将其构造函数私有化,杜绝外部new 对象,然后又该类自己提供一个静态的方法,产生对象供外部使用,这样便实现了单例的基本要求.

public class Singleton2 {
	
	private static Singleton2 instance=null;
	
	//将构造函数私有化,杜绝外部new 对象
	private Singleton2(){}
	
	public static Singleton2 getInstatnce(){
		if(instance==null){
			instance = new Singleton2();
		}
		return instance;
	}
}

上面的代码看似实现了单例的要求,但是在多线程的环境下,这样的方式就会有一些问题,getInstance()方法由于在线程竞争的情况下,无法保证 只产生一个对象,所以该方法要加上同步机制。

如果在getInstance()方法上直接加上synchronized,大家称呼为懒汉式,如下代码,虽然解决了多线程的问题,但是每次调用该同步方法的时候,效率不是很好。

public class Singleton2 {
	
	private static Singleton2 instance=null;
	
	//将构造函数私有化,杜绝外部new 对象
	private Singleton2(){}
	
	public static synchronized Singleton2 getInstatnce(){
		if(instance==null){
			instance = new Singleton2();
		}
		return instance;
	}
}

还有一种方式叫饿汉式,即是在类加载的时候即产生一个静态的instance对象,这样也解决了问题,例如

public class Singleton2 {
	
	private static final Singleton2 instance= new Singleton2();
	
	//将构造函数私有化,杜绝外部new 对象
	private Singleton2(){}
	
	public static  Singleton2 getInstatnce(){
		return instance;
	}
}

注意,上面的instance加了final关键字,防止外部修改instance变量;这样的方式基本没什么问题,唯一的小遗憾就是这个对象不管你用不用,在类加载的时候就new 出来了,感觉不是十分完美。相对应得还有一种叫双重锁的方式,个人觉得比较完美,代码如下:


public class Singleton {
	private static Singleton instance=null;
	
	//将构造函数私有化,杜绝外部new 对象
	private Singleton(){}
	
	public static Singleton getInstatnce(){
		if(instance==null){
			synchronized(Singleton.class){
				if(instance==null){
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}

具体的实现方式还要看具体的项目环境吧!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值