摘要:輸出結(jié)果輸出結(jié)果此外還有兩種實現(xiàn)單例的方式,我呢也給大家列出來,方便大家學(xué)習(xí)和參考方式一方式二單例模式實現(xiàn)方式二。。。
什么是單例模式?通俗點講:單例模式就是在程序執(zhí)行的過程中,類只有一個實例,這不是說單例模式只能去創(chuàng)建一個實例,而是你創(chuàng)建的所有實例(也就是對象)都指的是同一個實例。如何做到這一點呢?我們的__new__特殊方法就派上用場了,可能大家對這個方法熟悉又陌生,那么接下來通過一個小程序簡單的過渡一下
class A(): def __new__(cls): return "你好" def __init__(self): print(self) print(A())
猜想一下,這里控制臺會輸出什么?
輸出結(jié)果:你好
這里再創(chuàng)建A對象的時候就會先執(zhí)行__new__方法,然后將返回值傳遞給__init__方法的self,所以結(jié)果會是:你好,這這段程序中我們知道對象的創(chuàng)建是依靠__new__方法的,那么我們就可以通過這個方法入手,每次創(chuàng)建對象的時候在__new__方法內(nèi)部進行判斷,不拐彎抹角了,直接附上為小伙伴們準備的代碼。
class A(): _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance def __init__(self): print(self) A() #輸出結(jié)果:<__main__.A object at 0x0000020CED433FD0> A() #輸出結(jié)果:<__main__.A object at 0x0000020CED433FD0>
此外還有兩種實現(xiàn)單例的方式,我呢也給大家列出來,方便大家學(xué)習(xí)和參考:
# 方式一 def Single(cls,*args,**kwargs): instances = {} def get_instance (*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @Single class B: pass # 方式二 class Single: def __init__(self): print("單例模式實現(xiàn)方式二。。。") single = Single() del Single # 每次調(diào)用single就可以了
通過測驗,可以清晰對比到兩個對象地址是一樣的,可見我們的目的就達到了,上面三種實現(xiàn)方式
在使用中也略有不同,大家可以根據(jù)需要使用。
謝謝大家的支持!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42923.html
摘要:博主按每天一個設(shè)計模式旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實現(xiàn)。單例模式用途如果一個類負責連接數(shù)據(jù)庫的線程池日志記錄邏輯等等,此時需要單例模式來保證對象不被重復(fù)創(chuàng)建,以達到降低開銷的目的。 博主按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實...
摘要:博主按每天一個設(shè)計模式旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實現(xiàn)。單例模式用途如果一個類負責連接數(shù)據(jù)庫的線程池日志記錄邏輯等等,此時需要單例模式來保證對象不被重復(fù)創(chuàng)建,以達到降低開銷的目的。 博主按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實...
摘要:總之,選擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。二餓漢式單例餓漢式單例類在類初始化時,已經(jīng)自行實例化靜態(tài)工廠方法餓漢式在類創(chuàng)建的同時就已經(jīng)創(chuàng)建好一個靜態(tài)的對象供系統(tǒng)使用,以后不再改變,所以天生是線程安全的。 概念: Java中單例模式是一種常見的設(shè)計模式,單例模式的寫法有好幾種,這里主要介紹兩種:懶漢式單例、餓漢式單例?! 卫J接幸韵绿攸c: 1、單例類只能有一個實例?!?..
摘要:單例模式在某些場景下,我們希望實體類無論實例化多少次都只會產(chǎn)生一個實體對象,這時候就需要使用單例模式。經(jīng)常使用的場景就是全局配置類。 單例模式 在某些場景下,我們希望實體類無論實例化多少次都只會產(chǎn)生一個實體對象,這時候就需要使用單例模式。經(jīng)常使用的場景就是全局配置類。 模式框架 方式1:使用修飾器 使用函數(shù)定義裝飾器 def singletons(cls): 定義一個...
摘要:在工廠方法模式中,我們會遇到一個問題,當產(chǎn)品非常多時,繼續(xù)使用工廠方法模式會產(chǎn)生非常多的工廠類。從簡單工廠模式到抽象工廠模式,我們都是在用后一種模式解決前一種模式的缺陷,都是在最大程度降低代碼的耦合性。 單例模式 所謂單例模式,也就是說不管什么時候我們要確保只有一個對象實例存在。很多情況下,整個系統(tǒng)中只需要存在一個對象,所有的信息都從這個對象獲取,比如系統(tǒng)的配置對象,或者是線程池。這些...
閱讀 2406·2021-10-09 09:44
閱讀 2139·2021-10-08 10:05
閱讀 3431·2021-07-26 23:38
閱讀 3008·2019-08-28 18:16
閱讀 820·2019-08-26 11:55
閱讀 1827·2019-08-23 18:29
閱讀 2042·2019-08-23 18:05
閱讀 1372·2019-08-23 17:02