您好,登錄后才能下訂單哦!
小編給大家分享一下Java設計模式中單件模式有什么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
單件模式確保一個類只有一個實例,并提供一個全局訪問點
public class Singleton{ private static Singleton uniqueInstance; // 利用一個靜態變量來記錄Singleton類的唯一實例 private Singleton(){} // 把構造器聲明為私有的,只有自Singleton類內才可以調用構造器 // 用getInstance()方法實例化對象,并返回這個實例 public static Singleton getInstance(){ if (uniqueInstance == null){ uniqueInstance = new Singleton(); } return uniqueInstance; } }
在多線程中以上代碼會生成多個實例,所以需要我們對代碼進行改進
public class Singleton{ private static Singleton uniqueInstance; private Singleton(){} public static synchronized Singleton getInstance(){ if(uniqueInstance == null){ uniqueInstance = new Singleton(); } return uniqueInstance; } }
通過增加synchronized關鍵字到getInstance()方法中,我們迫使每個線程在進入這個方法之前,要先等候別的線程離開該方法。也就是說,不會有兩個線程可以同時進入這個方法。
public class Singleton{ // 在靜態初始化器(static initializai)中創建單件。這樣可以保證線程安全(thread sate) private static Singleton uniqueInstance = new Singleton(); private static Singleton getInstance(){ return uniqueInstance; } }
在JVM在加載這個類時馬上創建此唯一的單件實例。JVM保證在任何線程訪問uniqueInstance靜態變量之前,一定創建此實例。
會有兩次檢查實例是否存在,若不存在則創建實例,若存在則返回
public class Singlenton{ // volatile關鍵詞:當uniqueInstance變量被初始化成Singleton實例時,多個線程正確地處理uniqueInstance變量 private volatile static Singleton uniqueInstance(); private Singleton(){} public static Singleton getInstance(){ // 檢查實例,如果不存在,就進入同步區塊 if(uniqueInstance == null){ // 進入區塊后,再檢查一次。如果仍是null,才創建實例 synchronized (Singleton.class){ if(uniqueInstance == null){ uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
Python 的模塊就是天然的單件模式,在模塊第一次被導入時,會生成.pyc文件,之后再次導入時,就會直接加載之前生成的.pyc文件,不會再次執行模塊代碼
先創建一個Singleton文件
class Singleton: def getSingleton: pass singleton = Singleton()
在其他文件中導入這個模塊,這個類的地址是唯一的
當實例化一個對象時,先調用類的__new__方法 ,默認調用的是父類Object.__new__方法,實例化對象。然后再調用類的__init__方法進行屬性的初始化。
我們可以再__new__方法內加一個判斷,若實例存在,則不實例化,若不存在,則實例化。
class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = object.__new__(cls, *args, **kwargs) return cls._instance def __init__(self): pass
通過裝飾器來實現單件模式
def singleton(cls): # 創建一個私有變量,類型為字典,用來存放類地址的 _instance = {} def inner(): # 如果類不存在 if cls not in _instance: # 實例化一個類并存放在字典里 _instance[cls] = cls() return _instance[cls] return inner @singleton class ClassName(object): def __init__(self): pass
class Singleton(object): def __init__(self, cls): self._cls = cls # 接受類名 self._instance = {} # 存放類地址 def __call__(self): if self._cls not in self._instance: # 實例化類并存放在字典內 self._instance[self._cls] = self._cls() return self._instance[self._cls] @Singleton class ClassName(object): def __init__(self): pass
看完了這篇文章,相信你對“Java設計模式中單件模式有什么用”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。