單例,顧名思義是一個實例,即在一個項目之中,單例的類只實例化一次。它常常應用於資料庫操作、日誌函數。

在一個大型項目中使用到日誌和資料庫操作的地方很多,不能每個文件都去單獨實例化一次,此時單例模式就顯示出了他的價值。

單例的核心在類的內部方法__new__(),每次實例化都是通過執行new函數來返回實例對象。

單例就是在類裡面定義一個作用域最高的標誌性的屬性,如果實例化過一次,那這個屬性為True否則為False,那麼返回上次實例化的對象。

code實例:

class Singleton(object):

def __new__(cls, *args, **kw):
if not hasattr(cls, _instance):
org = super(Singleton, cls)
cls._instance = org.__new__(cls, *args, **kw)
return cls._instance

# 複寫內部方法__new__()
通過hasattr函數判斷該類實例化時有沒有_instance屬性
如果不存在,那麼繼承並返回原始的__new__方法給_instance屬性
如果存在則直接返回_instance屬性所指的對象

到目前為止,已經闡述了設計模式中的創建型模式,分別是:工廠方法、抽象工廠方法、建造者、原型模式、單例模式,他們之所以屬於創建型,在於他們控制或者影響一個實例化對象的創建過稱。

工廠方法和抽象工廠控制實例對象時候的類選擇,建造者模式控制多個類以相同的流程實例化、原型模式通過深度複製原型類讓類的多個實例化更加的迅速,單例模式讓類的實例化對象只存在一個。

推薦閱讀:

相关文章