1. 程式人生 > 實用技巧 >Java併發程式設計:volatile關鍵字解析

Java併發程式設計:volatile關鍵字解析

一、簡介

單例模式(Singleton Pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某一個類只有一個例項存在,並提供全域性訪問點。因此,單例模式通常用於日誌記錄、資料庫操作、印表機後臺及其他程式---該程式只生成一個例項,以避免對同一資源產生相互衝突的請求。

簡言之,單例設計模式的意圖如下:

確保類有且只有一個物件被建立
為物件提供一個訪問點,以使程式可以全域性訪問該物件
控制共享資源的並行訪問

利用Python實現經典的單例模式:(使用__new__方法)

new方法為python例項化建立物件自動執行的函式,通過重寫這個函式,使之先判斷該類中是否有instance屬性(利用反射),若沒有則為建立一個物件併為該屬性賦值,最後返回instance中的物件。通過這種方式我們實現了每次建立例項返回的都是類中的instance的值。

單例模式之懶漢式例項化

單例模式的用例之一就是懶漢式例項化。例如,在匯入模組的時候,我們可能會無意中建立一個物件,但時卻根本用不到他、懶漢式例項化能夠確保在需要時才建立物件

感覺像是手動完成單例建立邏輯,但注意獲得例項一定要呼叫Singleton.getInstance()方法,直接s=Singleton()相當於沒用單例

Monostate單例模式:

這種模式的理念為:例項化的物件是不同的,但是物件的狀態,屬性是相同的,也就是單態模式

這裡的實現方式為利用類中的dict方法,我感覺是將_shared_state賦給dict後,每個物件的dict的地址都是相同的,所以物件的屬性儲存的位置都相同,那麼一個物件的屬性變化,其餘的屬性也會發生變化

元類單例模式:

執行Loggre後,首先會呼叫MetaSingleton中的call函式,如果Singleton類沒有在instance中,則為其建立一個例項,也就是正常呼叫type中的call函式,將返回的物件存在instance中,以該類名為鍵,物件為值,最後返回這個物件,若instance中有該類,那就直接返回儲存的物件。 這種方式我覺得較好,不用為每個類單獨建立單例模式,只需將元類重寫即可

元類參考連結:https://www.cnblogs.com/yssjun/p/9832526.html

用 __call__() 彌補 hasattr() 函式的短板

hasattr() 函式的功能是查詢類的例項物件中是否包含指定名稱的屬性或者方法,但該函式有一個缺陷,即它無法判斷該指定的名稱,到底是類屬性還是類方法。



要解決這個問題,我們可以藉助可呼叫物件的概念。要知道,類例項物件包含的方法,其實也屬於可呼叫物件,但類屬性卻不是。舉個例子:

可以看到,由於 name 是類屬性,它沒有以call為名的call() 方法;而 say 是類方法,它是可呼叫物件,因此它有call() 方法。

另外,我們可以通過__call__中呼叫我們想要呼叫的方法。引數傳遞可以利用*args和**kwards。