單例模式以及四種實現方法


單例模式

一、什么是單例模式

類的設計模式有23種

單例模式是其中一種設計模式

單例模式:即單個實例,指的是同一個類實例化多次的結果都指向同一個對象,可以用於節省內存空間

二、實現單例模式的四種方法

舉例:當用戶輸入端口和地址,實例化產生新對象

​ 當用戶不輸入端口和地址,每次拿到的對象都是同一個

需要創建一個settings文件配置端口和地址數據

2.1 定義一個類方法實現單例模式

class Sql():
    _instance = None
    def __init__(self,post,host):
        self.post = post
        self.host = host
    # @classmethod
    # def get_sigoleton(cls):     
    #     import settings
    #     if cls._instance:
    #         return cls._instance
    #     else:
    #         cls._instance=cls(settings.PORT,settings.HOST)
    #         return cls._instance
    # 下面這種和上面一樣,判斷對象是否為空,空的就實例化產生對象
    @classmethod
    def get_sigonleton(cls):
        import settings
        if not cls._instance:
            cls._instance = cls(settings.POST,settings.HOST)
        return cls._instance 

s1=Sql.get_sigonleton()
s2=Sql.get_sigonleton()
print(s1)
print(s2)

2.2 定義一個裝飾器實現單例模式

# 先定義一個裝飾器
def get_sigonleton(cls):
    import settings
    _instance = cls(settings.PORT,settings.HOST)
    def wrapper(*args,**kwargs):
        if len(args) != 0 or len(kwargs) != 0:
            # 表示傳了參數,生成新對象
            res = cls(*args,**kwargs)
            return res
        else:
            return _instance
    return wrapper

@get_sigonleton
class Sql():
    def __init__(self,port,host):
        self.port = port
        self.host = host

s1=Sql()
s2=Sql()
print(s1)  # <__main__.Sql object at 0x0000026A68DB9390>
print(s2)  # <__main__.Sql object at 0x0000026A68DB9390> 兩個對象都指向同一個內存地址
s3=Sql(3308,'192.168.1.3')
print(s3)  # <__main__.Sql object at 0x0000026A68BFCE48> 用戶輸入數據就得到新對象

2.3 定義一個元類實現單例模式

class Mymeta(type):
    def __init__(self,name,bases,dic):
        import settings
        # 把實例化好的對象,放到了類的名稱空間
        self._instance = self(settings.PORT,settings.HOST)
    def __call__(self, *args, **kwargs):
        # 2、進行判斷
        if len(args) != 0 or len(kwargs) != 0:
            obj = object.__new__(self)
            obj.__init__(*args, **kwargs)
            return obj
        else:
            return self._instance

class Sql(metaclass=Mymeta):  # 相當於Sql=Mymeta(name,bases,dic),這個會調用Mymeta的__init__方法
    def __init__(self,port,host):
        self.port = port
        self.host = host

s1 = Sql()
# 1、調用元類的__call__
s2 = Sql()
print(s1)
print(s2)

2.4 通過模塊導入實現單例模式(python的模塊是天然的單例)

# 這個方法需要先創建一個sigonleton.py文件,把類Sql的定義和實例化放到這個文件中
# 然后在本文件導入sigonleton.py中的s1
def test():
    from sigonleton import s1
    print(s1)
def test2():
    from sigonleton import s1
    print(s1)
test()
test2()

https://www.cnblogs.com/zhuangyl23/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM