摘要:單例模式在某些場景下,我們希望實(shí)體類無論實(shí)例化多少次都只會(huì)產(chǎn)生一個(gè)實(shí)體對(duì)象,這時(shí)候就需要使用單例模式。經(jīng)常使用的場景就是全局配置類。
單例模式
在某些場景下,我們希望實(shí)體類無論實(shí)例化多少次都只會(huì)產(chǎn)生一個(gè)實(shí)體對(duì)象,這時(shí)候就需要使用單例模式。經(jīng)常使用的場景就是全局配置類。模式框架
方式1:使用修飾器
"""使用函數(shù)定義裝飾器""" def singletons(cls): """ 定義一個(gè)單例裝飾器,使用dict保存定義好的實(shí)體,key為class的地址而不是名字,這樣同名類也不會(huì)沖突 """ 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__方法,只能針對(duì)當(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43202.html
摘要:輸出結(jié)果輸出結(jié)果此外還有兩種實(shí)現(xiàn)單例的方式,我呢也給大家列出來,方便大家學(xué)習(xí)和參考方式一方式二單例模式實(shí)現(xiàn)方式二。。。 什么是單例模式?通俗點(diǎn)講:單例模式就是在程序執(zhí)行的過程中,類只有一個(gè)實(shí)例,這不是說單例模式只能去創(chuàng)建一個(gè)實(shí)例,而是你創(chuàng)建的所有實(shí)例(也就是對(duì)象)都指的是同一個(gè)實(shí)例。如何做到這一點(diǎn)呢?我們的__new__特殊方法就派上用場了,可能大家對(duì)這個(gè)方法熟悉又陌生,那么接下來通過...
摘要:博主按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實(shí)現(xiàn)。單例模式用途如果一個(gè)類負(fù)責(zé)連接數(shù)據(jù)庫的線程池日志記錄邏輯等等,此時(shí)需要單例模式來保證對(duì)象不被重復(fù)創(chuàng)建,以達(dá)到降低開銷的目的。 博主按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)...
摘要:博主按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實(shí)現(xiàn)。單例模式用途如果一個(gè)類負(fù)責(zé)連接數(shù)據(jù)庫的線程池日志記錄邏輯等等,此時(shí)需要單例模式來保證對(duì)象不被重復(fù)創(chuàng)建,以達(dá)到降低開銷的目的。 博主按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)...
摘要:在工廠方法模式中,我們會(huì)遇到一個(gè)問題,當(dāng)產(chǎn)品非常多時(shí),繼續(xù)使用工廠方法模式會(huì)產(chǎn)生非常多的工廠類。從簡單工廠模式到抽象工廠模式,我們都是在用后一種模式解決前一種模式的缺陷,都是在最大程度降低代碼的耦合性。 單例模式 所謂單例模式,也就是說不管什么時(shí)候我們要確保只有一個(gè)對(duì)象實(shí)例存在。很多情況下,整個(gè)系統(tǒng)中只需要存在一個(gè)對(duì)象,所有的信息都從這個(gè)對(duì)象獲取,比如系統(tǒng)的配置對(duì)象,或者是線程池。這些...
摘要:用來指向已創(chuàng)建好的實(shí)例構(gòu)造函數(shù)為空注意這里是關(guān)鍵這是我們需要調(diào)用的方法把函數(shù)也定義為空,這樣就大功告成啦。 接上一篇大話PHP設(shè)計(jì)模式之單例模式 這一篇介紹一下升級(jí)版的單例模式,廢話不說先上代碼 不完美的單例模式 class singleMode { //用來指向已創(chuàng)建好的實(shí)例 public static $instance; //判斷是...
閱讀 720·2021-11-22 09:34
閱讀 3850·2021-09-22 15:42
閱讀 1362·2021-09-03 10:28
閱讀 1109·2021-08-26 14:13
閱讀 1928·2019-08-29 15:41
閱讀 1455·2019-08-29 14:12
閱讀 3397·2019-08-26 18:36
閱讀 3337·2019-08-26 13:47