91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java設計模式中單件模式有什么用

發布時間:2021-11-13 19:01:03 來源:億速云 閱讀:205 作者:小新 欄目:開發技術

小編給大家分享一下Java設計模式中單件模式有什么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

定義

單件模式確保一個類只有一個實例,并提供一個全局訪問點

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單件模式

模塊實現

Python 的模塊就是天然的單件模式,在模塊第一次被導入時,會生成.pyc文件,之后再次導入時,就會直接加載之前生成的.pyc文件,不會再次執行模塊代碼
先創建一個Singleton文件

class Singleton:
	def getSingleton:
		pass
singleton = Singleton()

在其他文件中導入這個模塊,這個類的地址是唯一的

new關鍵字實現

當實例化一個對象時,先調用類的__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設計模式中單件模式有什么用”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双城市| 监利县| 无极县| 潮安县| 蓬安县| 沾化县| 榆社县| 伊吾县| 封开县| 怀仁县| 仪陇县| 维西| 项城市| 永宁县| 宜兴市| 个旧市| 丽水市| 五华县| 昌宁县| 尉犁县| 徐州市| 金门县| 沂源县| 达州市| 南岸区| 武鸣县| 靖边县| 云浮市| 枣庄市| 平南县| 获嘉县| 武安市| 北京市| 青冈县| 兴业县| 阿拉善左旗| 常宁市| 牡丹江市| 辽宁省| 江津市| 三河市|