單例模式建立的三種方式

2022-03-23 17:01:28 字數 1739 閱讀 9049

一、單例模式的好處

1.對於頻繁使用的物件,可以省略new操作花費的時間,這對於那些重量級物件而言,是非常可觀的一筆系統開銷;

2.由於new操作的次數減少,因而對系統記憶體的使用頻率也會降低,這將減輕gc壓力,縮短gc停頓時間。

二、建立方式

1)餓漢式

1 public class singleton

5     private static singleton instance = new singleton();

6     public static singleton getinstance()

9 }使用以上方式建立單例有幾點必須特別注意:

因為我們要保證系統中不會有人意外建立多餘的例項,因此

1.我們把singleton的建構函式設定為private。這點非常重要,這就警告所有的開發人員,不能隨便建立這個類的例項,從而有效避免該類被錯誤的建立。

2.instance物件必須是private並且static的。如果不是private,那麼instance的安全性無法得到保證。乙個小小的意外就可能使得in-stance變成null。

3.因為工廠方法getinstance()必須是static的,因此對應的instance也必須是static。

優點:這個單例的效能是非常好的,因為getinstance()方法只是簡單地返回instance,並沒有任何鎖操作,因此它在並行程式中,會有    良好的表現。

缺點:singleton例項在什麼時候建立是不受控制的。對於靜態成員instance,它會在類第一次初始化的時候被建立。這個時刻並不一定是getinstance()方法第一次被呼叫的時候。任何對singleton方法或者欄位的引用,都會導致類初始化,並建立instance例項,但是類初始化只有一次,因此instance例項永遠只會被建立一次

2)懶漢式

01 public class lazysingleton

05     private static lazysingleton instance = null;

06     public static synchronized lazysingleton getinstance()

11 }

注意點:

1.為了防止物件被多次建立,我們不得不使用synchronized進行方法同步。

優點:精確控制instance的建立時間,它只會在in-stance被第一次使用時,建立物件,這種實現的好處是,充分利用了延遲載入,只在真正需要時建立物件

缺點:併發環境下加鎖,競爭激烈的場合對效能可能產生一定的影響。

3)使用內部類

01 public class staticsingleton

05     private static class singletonholder

08     public static staticsingleton getinstance()

11 }

優點:同時擁有前兩種方式的優點

1.首先getinstance()方法中沒有鎖,這使得在高併發環境下效能優越

2.只有在getinstance()方法被第一次呼叫時,staticsingleton的例項才會被建立(這種方法巧妙地使用了內部類和類的初始化方式)

3.內部類singletonholder被申明為private,這使得我們不可能在外部訪問並初始化它。而我們只可能在getinstance()內部對singletonholder類進行初始化,利用虛擬機器的類初始化機制建立單例。

Python 建立單例模式的三種方式

原文出處 liuzhijun 裝飾器維護乙個字典物件instances,快取了所有單例類,只要單例不存在則建立,已經存在直接返回該例項物件。python def singleton cls instances if cls not in instances instances cls cls arg...

單例設計模式的三種方式

單例模式 0 保證乙個類只能獲取乙個例項 1,步驟 1.構造方法私有化 外部不能訪問,無法建立例項 2.在類的內部自己建立自己的例項,並且設定為static 因為外部不能獲取其實例,只能靜態獲取 public class singleton 單例 final修飾的 class student 單例 ...

單例模式的三種實現方式

1.餓漢模式 package com.fullstacker.study.designpattern.singleton 餓漢模式 餓漢模式是執行緒安全的單例模式 author xingguishuai create 2017 03 27 15 53 public class hungrysingl...