1. 程式人生 > 其它 >單例設計模式餓漢式和懶漢式的簡單實現(Java語言實現)

單例設計模式餓漢式和懶漢式的簡單實現(Java語言實現)

技術標籤:Java酬勤筆記java程式語言設計模式面試程式人生

單例設計模式餓漢式和懶漢式的簡單實現(Java語言實現)


單例設計模式介紹

什麼是單例設計模式:
所謂類的單例設計模式,就是採取一定的方法保證在整個軟體系統中,對某個類只能存在一個物件例項,並且只提供一個取得物件例項的方法。

實現原理:
要使類只能產生一個物件,首先,我們必須將類的構造器的訪問許可權設定為 private,,這樣我們就不能通過new關鍵字在外部多次建立物件了,但在類的內部我們仍可以產生該類的物件

因為在外部無法得到類的物件,我們只能提供一個 static關鍵字修飾過的靜態方法來提供訪問類內部建立的物件,而由於靜態方法只能訪問類中的靜態變數,所以我們內部的物件也必須定義成靜態的(有關static

關鍵字和靜態方法的概念可以康康我的另一篇文章Java中static關鍵字的使用)

說起來就這麼點東西了,接下來看看單例設計模式的兩種實現方式。


餓漢式單例模式

餓漢式單例模式介紹

顧名思義,餓漢式就是很餓,所以我們不管三七二十一,就把我們需要的那一個唯一的物件直接產生出來,然後加以封裝並提供呼叫的方法

程式碼實現

我們一步一步來,首先有一個叫Bank的類

public class Bank {
}

按照上面說的,我們需要一個private的構造器

public class Bank {
	//private許可權的構造器
	private Bank() {
    }
}

接著我們自己內部產生一個唯一的靜態物件

public class Bank {
        //private許可權的構造器
        private Bank() {
        }
        //Bank的內部直接new一個Bank類的物件instance
        private static Bank instance = new Bank();
        //這個instance可以理解為Bank類的屬性之一了
}

因為這個靜態變數是外部無法訪問的,所以我們需要提供一個公開的方法來供外部使用instance變數

public class Bank {
        //private許可權的構造器
        private
Bank() { } //Bank的內部直接new一個Bank類的物件instance //這個instance可以理解為Bank類的屬性之一了 private static Bank instance = new Bank(); //提供一個public的方法來返回instance物件 public static Bank getInstance(){ return instance;//返回instance物件 } }

其實到這裡一個簡單的餓漢式單例設計模式就寫完了,我們測試一下

public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1=new Bank();//無法new物件,因為沒有許可權
        bank1.getInstance;//更不用說通過物件呼叫方法了
    }
}

我們只能直接通過類中我們提供的方法來檢視內部物件

public class SingletonTest {
    public static void main(String[] args) {
        System.out.println(Bank.getInstance());
    }
}

執行結果:成功返回了物件的地址值

在這裡插入圖片描述

餓漢式的優缺點

  • 優點:餓漢式是執行緒安全的
  • 缺點:如果沒有第一時間使用,可能會浪費資源

懶漢式單例模式

懶漢式單例模式介紹

顧名思義,因為是懶漢式,所以很懶,只有在需要的時候才去動,及產生物件。

程式碼實現

因為相較於餓漢式差異不大,所以直接放上全程式碼

public class Bank {
        //private許可權的構造器
        private Bank() {
        }
        //類內部聲明瞭一個Bank變數,但並沒有new物件
        private static Bank instance = null;
		//提供外部使用的方法,第一次呼叫時若發現instance並不存在則new
		//一個物件後再返回
        public static Bank getInstance(){
            if(instance == null){
                instance = new Bank();
            }
            //當存在後,直接返回.
            return instance;
        }

}

懶漢式和餓漢式的唯一區別就在於,懶漢式在生成內部物件時,並沒有一開始就分配空間,而是等第一次真正使用時,才會去new一個物件。

懶漢式的優缺點

  • 優點:需要的時候才建立,延遲物件的建立
  • 但目前的懶漢式的實現是非執行緒安全的,需要完善。