Java設(shè)計模式之單件模式深入講解
定義
單件模式確保一個類只有一個實例,并提供一個全局訪問點
Java單件模式
經(jīng)典單件模式的實現(xiàn)
public class Singleton{
private static Singleton uniqueInstance; // 利用一個靜態(tài)變量來記錄Singleton類的唯一實例
private Singleton(){} // 把構(gòu)造器聲明為私有的,只有自Singleton類內(nèi)才可以調(diào)用構(gòu)造器
// 用getInstance()方法實例化對象,并返回這個實例
public static Singleton getInstance(){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
在多線程中以上代碼會生成多個實例,所以需要我們對代碼進行改進
多線程單件模式的實現(xiàn)
public class Singleton{
private static Singleton uniqueInstance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
通過增加synchronized關(guān)鍵字到getInstance()方法中,我們迫使每個線程在進入這個方法之前,要先等候別的線程離開該方法。也就是說,不會有兩個線程可以同時進入這個方法。
急切創(chuàng)建實例
public class Singleton{
// 在靜態(tài)初始化器(static initializai)中創(chuàng)建單件。這樣可以保證線程安全(thread sate)
private static Singleton uniqueInstance = new Singleton();
private static Singleton getInstance(){
return uniqueInstance;
}
}
在JVM在加載這個類時馬上創(chuàng)建此唯一的單件實例。JVM保證在任何線程訪問uniqueInstance靜態(tài)變量之前,一定創(chuàng)建此實例。
雙重檢查加鎖
會有兩次檢查實例是否存在,若不存在則創(chuàng)建實例,若存在則返回
public class Singlenton{
// volatile關(guān)鍵詞:當(dāng)uniqueInstance變量被初始化成Singleton實例時,多個線程正確地處理uniqueInstance變量
private volatile static Singleton uniqueInstance();
private Singleton(){}
public static Singleton getInstance(){
// 檢查實例,如果不存在,就進入同步區(qū)塊
if(uniqueInstance == null){
// 進入?yún)^(qū)塊后,再檢查一次。如果仍是null,才創(chuàng)建實例
synchronized (Singleton.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
Python單件模式
模塊實現(xiàn)
Python 的模塊就是天然的單件模式,在模塊第一次被導(dǎo)入時,會生成.pyc文件,之后再次導(dǎo)入時,就會直接加載之前生成的.pyc文件,不會再次執(zhí)行模塊代碼
先創(chuàng)建一個Singleton文件
class Singleton: def getSingleton: pass singleton = Singleton()
在其他文件中導(dǎo)入這個模塊,這個類的地址是唯一的
new關(guān)鍵字實現(xiàn)
當(dāng)實例化一個對象時,先調(diào)用類的__new__方法 ,默認調(diào)用的是父類Object.__new__方法,實例化對象。然后再調(diào)用類的__init__方法進行屬性的初始化。
我們可以再__new__方法內(nèi)加一個判斷,若實例存在,則不實例化,若不存在,則實例化。
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
裝飾器實現(xiàn)
通過裝飾器來實現(xiàn)單件模式
函數(shù)裝飾器
def singleton(cls):
# 創(chuàng)建一個私有變量,類型為字典,用來存放類地址的
_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:
# 實例化類并存放在字典內(nèi)
self._instance[self._cls] = self._cls()
return self._instance[self._cls]
@Singleton
class ClassName(object):
def __init__(self):
pass
以上就是Java設(shè)計模式之單件模式深入講解的詳細內(nèi)容,更多關(guān)于Java設(shè)計模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot+thymeleaf國際化之LocaleResolver接口的示例
本篇文章主要介紹了springboot+thymeleaf國際化之LocaleResolver的示例 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Java基于HttpClient實現(xiàn)RPC的示例
HttpClient可以實現(xiàn)使用Java代碼完成標(biāo)準HTTP請求及響應(yīng)。本文主要介紹了Java基于HttpClient實現(xiàn)RPC,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
mybatis中string和date的轉(zhuǎn)換方式
這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Java 基礎(chǔ)全面講解StringBuffer類的使用
當(dāng)對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象2022-01-01
詳解SpringBoot開發(fā)案例之整合定時任務(wù)(Scheduled)
本篇文章主要介紹了詳解SpringBoot開發(fā)案例之整合定時任務(wù)(Scheduled),具有一定的參考價值,有興趣的可以了解一下2017-07-07

