單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一,這種型別的設計模式屬于創建型模式,它提供了一種創建物件的最佳方式,
這種模式涉及到一個單一的類,該類負責創建自己的物件,同時確保只有單個物件被創建,這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要實體化該類的物件,
注意
單例類只能有一個實體,
單例類必須自己創建自己的唯一實體,
單例類必須給所有其他物件提供這一實體,
應用實體
音樂播放器或視頻播放器,需要被設計成單例的,保證同一時刻只有一首歌在播放或一個視頻在播放,
一些設備管理器常常設計為單例模式,比如一個電腦有兩臺列印機,在輸出的時候就要處理不能兩臺列印機列印同一個檔案,
全域唯一的配置物件,為全域提供唯一的一份配置,避免運行中配置修改造成配置的不統一,
創建的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連接等,
優點
在記憶體里只有一個實體,減少了記憶體的開銷,尤其是頻繁的創建和銷毀實體(比如管理學院首頁頁面快取),
避免對資源的多重占用(比如寫檔案操作),
缺點
沒有介面,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實體化,
注意
實體化程序要保證執行緒安全!
import threading
def synchronized(bar):
""" threading lock for Config"""
bar.__lock__ = threading.Lock() # get lock
def lock_func(*args, **kwargs):
with bar.__lock__:
return bar(*args, **kwargs)
return lock_func
class Filter_config(type):
def __new__(cls, cls_name, cls_mro, cls_attr):
cls_attr = {k.upper(): v for k, v in cls_attr.items() if not k.startswith('_')}
return super(Filter_config, cls).__new__(cls, cls_name, cls_mro, cls_attr)
class Config(metaclass=Filter_config): # 指定元類
""" Singleton `Config` ."""
_instance = None
@synchronized
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance
number = 100
config = Config()
print(config.NUMBER) # 100
單例的擴展
可以使用單例的設計思想維護一個實體集合 ,通過對實體集合的分發管理來約束某些資源,
例如
由于創建一個連接的成本過高,或者I/O開銷過大,但是單一物件又無法合理的利用資源,此時可以通過設定實體集合 來對有限個的連接進行管理,相當于建立鏈接池
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/119157.html
標籤:Python
下一篇:Python 函式和裝飾器
