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