1. 程式人生 > >設計模式(1)單例模式

設計模式(1)單例模式

**剛接觸設計模式的時候感覺很高大上的感覺,老師怎麼寫程式碼,就怎麼寫,沒有徹底的領會設計模式的深層次的思想。藉著複習的時間總結一下。**

1. 介紹:設計模式其實就是一種反覆使用的,多數人知曉的,經過分類編輯的程式碼設計經驗的總結。它停留在思想和經驗的層面上。
2. 目的:提高程式碼的重用性,使程式碼更容易理解,可靠性高。
## 靜態關鍵字static ##
因為首先是設計模式裡邊最簡單也最長用的單例模式。說以必須說一下靜態關鍵字這是個人的複習總結,大牛們可以直接略過

  1. static修飾方法,屬性,程式碼段。
  2. static修飾的方法為靜態方法,屬性為靜態屬性,在類載入的時候就已經開闢記憶體空間,並且無論物件建立多少次,靜態的屬性和方法只有一份。靜態方法不能訪問非靜態成員,一般方法
private static String name;//私有靜態屬性
public static SqlSession getSession()//共有靜態方法
  1. 靜態程式碼段在類載入的時候執行,為靜態屬性初始化
static{
name=new String("dmc is good!");
}

單例模式
單例模式的作用就是產生單一的物件,因為有些時候例如對配置檔案,工具類,快取,執行緒池,日誌物件等,這些資源的物件不必建立多個,因為都是一樣的,而且浪費資源,所以單例模式就是解決這個問題。
單例模式一般有以下的幾個性質。
1. 構造器私有。
2. 定義靜態的私有屬性。
3. 定義一個公共方法返回私有屬性。
單例模式有兩種常用的模式,懶漢式和餓漢式(一提懶漢想起了點什麼。。。)
為什麼要構造器私有?下面就是一個平常的類

public class Singleton{
    /*public Singleton() {
        super();
    }*/
}

如果要例項化這個類的話很簡單Singleton single=new Singleton();
這是java類的構造器的特點,類中如果沒有手動生命構造器,系統會自動的為類生命一個預設的構造器。這樣需要一個物件就例項化一次,就導致了多個物件的出現,但是這些物件的功能都是一樣的,所以沒有必要多次例項化,理論上只要例項化一次,之後如果需要就用這個單一的物件。所以就不能把構造方法設定成公共的,而是設定成
私有的構造器private Singleton(){} //私有構造器


這是我們想要通過new Singleton()是獲取不到物件的。只能通過單例類中定義的公共的方法把私有的單例類物件返回。

1.餓漢式

public class Singleton {
        private Singleton(){}  //私有構造器
        private static Singleton instance=new Singleton();//類載入是就初始化
        public static Singleton getInstance(){
            return instance;  //返回單例物件
        }
}

這裡的單例物件實在類載入的時候就已經建立。不管需不需要。
2.懶漢式

public class Singleton {
    private Singleton() {} // 私有構造器
    private static Singleton instance = null;// 類載入是就初始化
    public static synchronized Singleton getInstance() {
        if (instance == null)
            instance = new Singleton();// 第一次使用的的時候載入
        return instance; // 返回單例物件
    }
}

懶漢式涉及到執行緒安全的問題,可以在方法上加上同步鎖。但是會影響效率,一般都用不到,這裡僅考慮單例模式的這種思想。
兩種模式的區別
餓漢模式類載入的時候比較慢,在執行時獲取物件比較塊,執行緒安全。
懶漢模式類載入的時候比較快,在執行時獲取物件上慢,執行緒不安全的。