1. 建立和銷燬物件(1)
0
1. 考慮使用靜態工廠方法代替構造器
優點:
1. 靜態工廠方法擁有自己的名字,通過名字可以大概知道該方法實現了哪種功能;2.不需要在每次呼叫這些靜態工廠方法的時候建立一個新的物件;3. 可以返回任何子型別的物件,例如int,long,String等等;4.在建立引數化型別例項的時候,使程式碼變得更加簡潔。
缺點:
1.類如果不含公有的或者受保護的構造器,就不能被子類化,程式鼓勵附和而不是繼承。2. 和其他的靜態方法實際上沒有任何區別。
總結:靜態工廠通常比較合適設計,因此切忌第一反應就是提供共有的構造器,而不先考慮靜態工廠
2. 遇到多個構造器引數時要考慮構建器
構建器的作用:
1,增強程式碼的可讀性及減少程式碼的維護成本;
2,減少設計一個類時構造方法的個數.
builder模式也有自身的不足,為了建立物件,必須先建立他的構建器。雖然構建器的開銷在實踐中不是那麼明顯,但是在某些十分注重效能的情況下,就會成為問題。builder模式還比重疊構造器模式更為冗長,因此只有在引數比較多的時候菜使用,例如4個或者更多。
3. 用私有構造器或者列舉型別強化單例模式屬性(Singleton)
什麼是單例模式:單例模式是一種比較常見的設計模式。
特定:1.單例類只能有一個例項。2. 單例類必須自己建立自己唯一的例項。3. 單例類必須給所有其他物件提供這一例項。
單例模式有懶漢式單例(延遲載入,執行緒不安全的,但是可以通過修改某些方法使其變得安全)和餓漢式模式(在類初始化的時候,就已經被例項化,所以一開始就是執行緒安全的),
懶漢式:
public class Singleton {
//執行緒不安全
private static Singleton singleton=null;
private Singleton(){
}
public static Singleton getInstance(){
if (singleton==null) {
singleton=new Singleton();//通過這個方法例項化
}
return singleton;
}
}
為了讓上面的懶漢式單例變得執行緒安全,有以下3中方法
1.在getInstance方法加上同步,但是缺點是會影響效能
public static synchronized Singleton getInstance(){
if (singleton==null){
singleton=new Singleton();
}
return singleton;
}
2.雙重檢查鎖定
public static Singleton getInstance(){
if (singleton==null ){
synchronized (Singleton.class) {
if (singleton==null)
singleton=new Singleton();
}
}
return singleton;
}
3.靜態內部類,推薦使用這種方法,執行緒安全
private static class LazyHolder{
private static final Singleton INSTANCE=new Singleton();
}
public static final Singleton getInstance(){
return LazyHolder.INSTANCE;
}
4.最新的建議是使用列舉來強化單例模式,特定是隻需要編寫一個包含單個元素的public enum Elvis{
INSTANCE;
}:
private static final Singleton single=new Singleton();
public static Singleton getInstance(){
return single;
}
4. 通過私有構造器強化不可以被例項化的能力
目的和作用:某些工具類,我們不想讓他被例項化,例項對他沒有任何意義。然而,在缺少顯示構造器的情況下,編譯器會自動提供一個共有的,無參的預設構造器,對於使用者來說,這個構造器和其他的構造器沒有任何區別。
解決方法:我們只需要讓這個類包含私有構造器,那麼他就不能被例項化了。
eg:
public class Test{
private Test(){}
.....
}
副作用:使得一個類不能被子類化。所有的構造器都必須顯示或隱式地呼叫超類構造器,在這種情況下,子類就沒有可訪問的超類構造器可以呼叫。