设计模式回顾系列文章:
主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。
------------------------------------------------
作为一个程序员,我并不知道"茴"字有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将只被装载一次。
注意:类的构造函数需要为保护或者私有类型,防止直接实例化这个类。
举例:系统中各种连接池、对象池、线程池等等只需要一个实例的对象。