摘要:單例模式在某些場景下,我們希望實體類無論實例化多少次都只會產(chǎn)生一個實體對象,這時候就需要使用單例模式。經(jīng)常使用的場景就是全局配置類。
單例模式
在某些場景下,我們希望實體類無論實例化多少次都只會產(chǎn)生一個實體對象,這時候就需要使用單例模式。經(jīng)常使用的場景就是全局配置類。模式框架
方式1:使用修飾器
"""使用函數(shù)定義裝飾器""" def singletons(cls): """ 定義一個單例裝飾器,使用dict保存定義好的實體,key為class的地址而不是名字,這樣同名類也不會沖突 """ instances = {} def wrapper(*args, **kwargs): if cls not in instances.keys(): instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper
"""使用類定義裝飾器""" class singletons(object): instances = {} def __init__(self, cls): self.__cls = cls def __call__(self, *args, **kwargs): if self.__cls not in singletons.instances.keys(): singletons.instances[self.__cls] = self.__cls(*args, **kwargs) return singletons.instances[self.__cls]
方式2:重寫__new__方法,只能針對當(dāng)前修改的類有效
class SingletonTest(object): __instance = None __isFirstInit = False def __new__(cls, name): if not cls.__instance: SingletonTest.__instance = super().__new__(cls) return cls.__instance def __init__(self, name): if not self.__isFirstInit: self.__name = name SingletonTest.__isFirstInit = True def getName(self): return self.__nameUML圖 示例
@singletons class Test(object): def __init__(self, name): self.__name = name def hello(self): print("I am {} object {}".format(self.__name, id(self))) if __name__ == "__main__": test1 = Test("test1") test2 = Test("test2") test1.hello() test2.hello() """測試輸出""" # I am test1 object 2453169112512 # I am test1 object 2453169112512擴(kuò)展思考
單例模式的線程安全問題。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43202.html
摘要:輸出結(jié)果輸出結(jié)果此外還有兩種實現(xiàn)單例的方式,我呢也給大家列出來,方便大家學(xué)習(xí)和參考方式一方式二單例模式實現(xiàn)方式二。。。 什么是單例模式?通俗點講:單例模式就是在程序執(zhí)行的過程中,類只有一個實例,這不是說單例模式只能去創(chuàng)建一個實例,而是你創(chuàng)建的所有實例(也就是對象)都指的是同一個實例。如何做到這一點呢?我們的__new__特殊方法就派上用場了,可能大家對這個方法熟悉又陌生,那么接下來通過...
摘要:博主按每天一個設(shè)計模式旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實現(xiàn)。單例模式用途如果一個類負(fù)責(zé)連接數(shù)據(jù)庫的線程池日志記錄邏輯等等,此時需要單例模式來保證對象不被重復(fù)創(chuàng)建,以達(dá)到降低開銷的目的。 博主按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實...
摘要:博主按每天一個設(shè)計模式旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實現(xiàn)。單例模式用途如果一個類負(fù)責(zé)連接數(shù)據(jù)庫的線程池日志記錄邏輯等等,此時需要單例模式來保證對象不被重復(fù)創(chuàng)建,以達(dá)到降低開銷的目的。 博主按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實...
摘要:在工廠方法模式中,我們會遇到一個問題,當(dāng)產(chǎn)品非常多時,繼續(xù)使用工廠方法模式會產(chǎn)生非常多的工廠類。從簡單工廠模式到抽象工廠模式,我們都是在用后一種模式解決前一種模式的缺陷,都是在最大程度降低代碼的耦合性。 單例模式 所謂單例模式,也就是說不管什么時候我們要確保只有一個對象實例存在。很多情況下,整個系統(tǒng)中只需要存在一個對象,所有的信息都從這個對象獲取,比如系統(tǒng)的配置對象,或者是線程池。這些...
摘要:用來指向已創(chuàng)建好的實例構(gòu)造函數(shù)為空注意這里是關(guān)鍵這是我們需要調(diào)用的方法把函數(shù)也定義為空,這樣就大功告成啦。 接上一篇大話PHP設(shè)計模式之單例模式 這一篇介紹一下升級版的單例模式,廢話不說先上代碼 不完美的單例模式 class singleMode { //用來指向已創(chuàng)建好的實例 public static $instance; //判斷是...
閱讀 683·2021-11-22 09:34
閱讀 3822·2021-09-22 15:42
閱讀 1327·2021-09-03 10:28
閱讀 1072·2021-08-26 14:13
閱讀 1901·2019-08-29 15:41
閱讀 1423·2019-08-29 14:12
閱讀 3364·2019-08-26 18:36
閱讀 3307·2019-08-26 13:47