python設計模式-單例模式


單例模式應用場景

代碼的設計模式共有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()

image

 

 

 

由上述簡化的代碼可知,每次有客戶端連接時,都會創建新的對象,以調用其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. 所有封裝數據都一樣時用單例模式


免責聲明!

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



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