1. 程式人生 > >1. 建立和銷燬物件(1)

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(){}
        .....
    }
副作用:使得一個類不能被子類化。所有的構造器都必須顯示或隱式地呼叫超類構造器,在這種情況下,子類就沒有可訪問的超類構造器可以呼叫。