`

设计模式回顾之一:单例模式(Java的4种实现)

 
阅读更多

设计模式回顾系列文章:

主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。

------------------------------------------------

作为一个程序员,我并不知道"茴"字有4种写法。

但是,我知道单例有4种写法。

单例模式

目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。确保所有实体使用该对象相同的实例,而无需将引用传给他们。

程序实现:

实现一:急切实例化。

public class Singleton1{//急切实例化
	private static Singleton1 uniqueInstance=new Singleton1();
	private String objectName;

	private Singleton1(){}
	
    public static Singleton1 getInstance(){
    	return uniqueInstance;
    }
    
    public String getObjectName(){
		return objectName;
	}
    
	public void setObjectName(String objectName){
		this.objectName = objectName;
	}
}

实现二:延迟实例化。

public class Singleton2{//延迟实例化
	private static Singleton2 uniqueInstacne = null;
	private String objectName;
	
	private Singleton2(){}
	
	//synchronized会影响性能,适用于对性能要求不高时使用
	public static synchronized Singleton2 getInstance(){
		if(uniqueInstacne==null){
			uniqueInstacne=new Singleton2();
		}
        return uniqueInstacne;
	}

	public String getObjectName(){
		return objectName;
	}

	public void setObjectName(String objectName){
		this.objectName = objectName;
	}

}

实现三:双重检查加锁。

public class Singleton3{ //双重检查加锁
	//双重检查加锁只适用于Java 5
	//Java1.4或以下的版本中JVM对于volatile关键字的实现会导致双重加锁失效
	private volatile static Singleton3 uniqueInstance=null;
	private String objectName;
	
	private Singleton3(){}
	
	public static Singleton3 getInstance(){
		if(uniqueInstance==null){
			synchronized(Singleton3.class){
				if(uniqueInstance==null){
					uniqueInstance=new Singleton3();
				}
			}
		}
		return uniqueInstance;
	}
	
	public String getObjectName() {
		return objectName;
	}

	public void setObjectName(String objectName) {
		this.objectName = objectName;
	}
}

实现四:静态内部类。

public class Singleton4 {
	private static class Instance{
		public static final Singleton4 singleton = new Singleton4();
	}
	
	private Singleton4(){}
	private String objectName;
	
	public static Singleton4 getInstance(){
		return Instance.singleton;
	}
	
	public String getObjectName() {
		return objectName;
	}
	public void setObjectName(String objectName) {
		this.objectName = objectName;
	}
}

内部类Instance将只被装载一次。

 

注意:类的构造函数需要为保护或者私有类型,防止直接实例化这个类。

 

举例:系统中各种连接池、对象池、线程池等等只需要一个实例的对象。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics