單例 Singleton 指僅僅被執行個體化一次的類,Singleton 通常被用來代表本質上唯一的系統元件
實作Singleton有兩種方法,兩種方法都要把構造器私有化
并導出公有的靜态成員.
1.
public class Elvis{
public static final Elvis INSTANCE=new Elvis();
private Elvis(){}
public void leavetThebuilding(){...}
}
私有構造器僅被調用一次,缺少公有或受保護的構造器,保證了全局唯一性,一旦被執行個體化,隻會存在一個Elvis執行個體,但是用戶端可以利用反射 AcccessilblObject.setAccessilble方法調用私有構造器.
如需要抵抗這種攻擊,可以修改構造器,他被要求建立第二個執行個體的時候抛出異常
實作Singleton的第二種方法
public class Elvis{
private static final Elvis INSTANCE=new Elvis();
private Elvis(){}
public static Elvis getInstance(){ return INSTANCE;}
public void leavetThebuilding(){...}
}
考慮到序列化的情況,每次反序列化一個序列化執行個體時,都會建立一個新的執行個體,為反正這種情況需要在Elvis 類中加入readResolve方法
public Object readResolve(){
return INSTANCE;
}
3 枚舉方式
public enum Elvis {
INSTANCE;
public void leavetThebuilding(){…}
}