1. 程式人生 > >[設計模式][面向對象]單例模式

[設計模式][面向對象]單例模式

inversion 使用 實例化 占用 開閉 final spa logs 修改

設計模式遵循的原則有6個:

1、開閉原則(Open Close Principle)

  對擴展開放,對修改關閉。

2、裏氏代換原則(Liskov Substitution Principle)

  只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。

3、依賴倒轉原則(Dependence Inversion Principle)

  這個是開閉原則的基礎,對接口編程,依賴於抽象而不依賴於具體。

4、接口隔離原則(Interface Segregation Principle)

  使用多個隔離的借口來降低耦合度。

5、迪米特法則(最少知道原則)(Demeter Principle)

  一個實體應當盡量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立。

6、合成復用原則(Composite Reuse Principle)

  原則是盡量使用合成/聚合的方式,而不是使用繼承。繼承實際上破壞了類的封裝性,超類的方法可能會被子類修改。


[單例模式]

單例設計模式所解決的實際問題:保證類的對象在內存中唯一。

特點:構造方法私有化,外部無法通過構造方法實例化類

1.餓漢式(基本實現代碼)

class Student 
{
    private static final Student s = new
Student(); private Student(){} //獲取類的唯一實例 public static Student getInstance()  //約定的命名規範 /getInstance/ { return s; } }

優點:餓漢模式天生是線程安全的,使用時沒有延遲。

缺點:啟動時即創建實例,啟動慢,有可能造成資源浪費。

2.懶漢式

class Student
{
    private static Student s=null;

    private Single(){}

    
public static Student getInstance() { if(s==null) s=new Student(); return s; } }

優點:懶加載啟動快,資源占用小,使用時才實例化,無鎖。

缺點:非線程安全。

3.Holder模式

public class Singleton {
    /**
     * 類級的內部類,也就是靜態的成員式內部類,該內部類的實例與外部類的實例
     * 沒有綁定關系,而且只有被調用到才會裝載,從而實現了延遲加載
     */
    private static class SingletonHolder{
        //靜態初始化器,由JVM來保證線程安全
        private static Singleton instance = new Singleton();
    }

    //私有化構造方法
    private Singleton(){
    }
    public static  Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

優點:將懶加載和線程安全完美結合的一種方式(無鎖)。(推薦)

[設計模式][面向對象]單例模式