成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python版設(shè)計(jì)模式之單例模式

xiao7cn / 1604人閱讀

摘要:單例模式在某些場景下,我們希望實(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.__name
UML圖

示例
@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

相關(guān)文章

  • python單例模式實(shí)現(xiàn)的三種方式

    摘要:輸出結(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è)方法熟悉又陌生,那么接下來通過...

    dack 評(píng)論0 收藏0
  • 每天一個(gè)設(shè)計(jì)模式單例模式

    摘要:博主按每天一個(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í)...

    yy736044583 評(píng)論0 收藏0
  • 每天一個(gè)設(shè)計(jì)模式單例模式

    摘要:博主按每天一個(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í)...

    lijy91 評(píng)論0 收藏0
  • python單例模式和工廠模式

    摘要:在工廠方法模式中,我們會(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ì)象,或者是線程池。這些...

    jayce 評(píng)論0 收藏0
  • 大話PHP設(shè)計(jì)模式單例模式升級(jí)

    摘要:用來指向已創(chuàng)建好的實(shí)例構(gòu)造函數(shù)為空注意這里是關(guān)鍵這是我們需要調(diào)用的方法把函數(shù)也定義為空,這樣就大功告成啦。 接上一篇大話PHP設(shè)計(jì)模式之單例模式 這一篇介紹一下升級(jí)版的單例模式,廢話不說先上代碼 不完美的單例模式 class singleMode { //用來指向已創(chuàng)建好的實(shí)例 public static $instance; //判斷是...

    darcrand 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<