想寫設計模式,是由於讀完了《漫談設計模式》,有頗多感觸。python
將本身對於設計模式的理解記錄下來,一方面防止本身遺忘,另外一方面也能夠給新手們一些入門級的幫助。程序員
若是你要我給你一個看下去的理由的話,那麼我只說四個字——淺顯易懂。web
設計模式原本是一個很簡單的東西,可是被專家們一總結一概括,就變成了一套一套的理論。sql
我以爲對於新手來講,最重要的是搞懂「是什麼」和「爲何」,至於更深層的東西,等你實踐得多了天然就懂了。數據庫
文中示例所用語言爲python,簡潔明瞭。設計模式
我的理解不免有些誤差,若是有錯誤歡迎你們指出,我會及時改正的。安全
也歡迎你們提出各類意見建議。框架
重複一遍——淺顯易懂。至於到底多淺顯易懂,請往下看吧。性能
要查看本系列全部文章,請點擊頁面右側「隨筆分類」中的「設計模式」。學習
言歸正傳,先來看問題:
class sql_query(): # 用於進行數據庫查詢 def get_db(): # 鏈接數據庫 ...... db = create_db_connection() ...... return db def run_query(sql): # 執行查詢命令 db = get_db result = db.exec(sql) return result test = sql_query() print test.run_query("SELECT * FROM books;") print test.run_query("SELECT * FROM authors;")
很簡單的一個數據庫查詢例子,咱們分析一下這個例子有什麼問題。
運行了兩條查詢命令,每次運行都會先建立數據庫鏈接而後執行命令。
也就是說若是咱們運行N條命令,就須要建立N次數據庫鏈接。
咱們知道不管是網站仍是軟件,響應速度都是很是重要的。而建立數據庫鏈接自己就是一個很是費時的操做,因此這樣的代碼會致使很是嚴重的性能問題。
解決方法就是採用單例模式,不少人應該都聽過這個名詞,單例單例,就是隻有一個實例。
看代碼:
class sql_query(): # 用於進行數據庫查詢 def __init__(self): self.db = _get_db def _get_db(): # 鏈接數據庫 ...... db = create_db_connection() ...... return db def run_query(sql): # 執行查詢命令 result = self.db.exec(sql) return result test = sql_query() print test.run_query("SELECT * FROM books;") print text.run_query("SELECT * FROM authors;")
很簡單,咱們把數據庫鏈接db保存爲實例變量,這樣只會在建立實例的時候初始化一次db,以後就能夠直接使用了。
上面的代碼雖然已經能夠用了,不過還能夠進行一下改進:
class sql_query(): # 用於進行數據庫查詢 def __init__(self): self.db = None def _get_db(): # 鏈接數據庫 ...... db = create_db_connection() ...... return db def run_query(sql): # 執行查詢命令 if not self.db: self.db = _get_db() result = self.db.exec(sql) return result test = sql_query() print test.run_query("SELECT * FROM books;") print text.run_query("SELECT * FROM authors;")
看出區別了嗎?咱們此次並無在建立實例的時候初始化數據庫鏈接,而是在第一次進行查詢的時候建立。
這樣作的好處就是,咱們在真正須要運行查詢的時候才建立鏈接,進一步提升了性能。
有幾點須要注意:
下回咱們學習工廠方法。
最後,請回答這兩個問題:
單例模式能解決什麼問題?
單例模式是怎麼解決這個問題的?