读书人

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

发布时间: 2012-11-17 11:14:16 作者: rapoo

设计模式回顾之一:单例模式(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将只被装载一次。

?

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

?

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

读书人网 >软件开发

热点推荐