單例模式應用場景
代碼的設計模式共有25種,設計模式其實是代碼無關的。其目的是基於OOP的思想,不同應用場景應用不同的設計模式,從而達到簡化代碼、利於擴展、提示性能等目的。本文簡述Python實現的單例模式場景。
簡而言之,單例模式的應用場景是所有實例對象封裝的數據都相同的場景。在這樣的場景下應用單例模式可以減少重復創建對象,從而節約內存。
例如,在數據庫並發連接場景中,每次連接所用到的ip、端口,用戶名、密碼等相同,由於每次單獨連接數據庫耗時較長,所以通常會如下圖,先創建個連接池,該連接池已與數據庫創建好鏈接,其他用戶想訪問數據時先連接到此連接池,由連接池分配鏈接,從而節約時間。 此處連接池分配連接ID可簡化為下述代碼:
1 class ConnectionPool: 2 __instance = None 3 def __init__(self): 4 self.addr = '127.0.0.1' 5 self.port = 8008 6 self.name = 'sql' 7 self.conn_list = [1,2,3,4,5,6,7,8,9,10] 8 def get_connection(self): 9 r = random.randrange(1, 11) 10 return r 11 P = ConnectionPool 12 P.get_connection()
由上述簡化的代碼可知,每次有客戶端連接時,都會創建新的對象,以調用其get_connection方法。在這種重復創建對象,且對象中封裝的數據相同時,即可利用單例模式,節約內存提升性能。
單例模式示例:
1 class ConnectionPool: 2 __instance = None 3 def __init__(self): 4 self.addr = '127.0.0.1' 5 self.port = 8008 6 self.name = 'sql' 7 self.conn_list = [1,2,3,4,5,6,7,8,9,10] 8 @staticmethod 9 def get_instance(): 10 if ConnectionPool.__instance: 11 return ConnectionPool.__instance 12 else: 13 ConnectionPool.__instance == ConnectionPool() 14 return ConnectionPool.__instance 15 def get_connection(self): 16 r = random.randrange(1, 11) 17 return r
以上示例,通過一個私有變量,一個靜態方法 get_instance()實現了一次創建對象,多次連接。
總結下:
1. 單例只有一個實例
2. 靜態方法、靜態字段
3. 所有封裝數據都一樣時用單例模式