寫給新手的設計模式教程——單例模式

零、寫在前面

 

想寫設計模式,是由於讀完了《漫談設計模式》,有頗多感觸。python

將本身對於設計模式的理解記錄下來,一方面防止本身遺忘,另外一方面也能夠給新手們一些入門級的幫助。程序員

若是你要我給你一個看下去的理由的話,那麼我只說四個字——淺顯易懂web

設計模式原本是一個很簡單的東西,可是被專家們一總結一概括,就變成了一套一套的理論。sql

我以爲對於新手來講,最重要的是搞懂「是什麼」和「爲何」,至於更深層的東西,等你實踐得多了天然就懂了。數據庫

文中示例所用語言爲python,簡潔明瞭。設計模式

 

我的理解不免有些誤差,若是有錯誤歡迎你們指出,我會及時改正的。安全

也歡迎你們提出各類意見建議。框架

 

重複一遍——淺顯易懂。至於到底多淺顯易懂,請往下看吧。性能

 

要查看本系列全部文章,請點擊頁面右側「隨筆分類」中的「設計模式」。學習

 

1、單例模式

 

言歸正傳,先來看問題:

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,以後就能夠直接使用了。

 

2、小小改進

 

上面的代碼雖然已經能夠用了,不過還能夠進行一下改進:

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;")

看出區別了嗎?咱們此次並無在建立實例的時候初始化數據庫鏈接,而是在第一次進行查詢的時候建立。

這樣作的好處就是,咱們在真正須要運行查詢的時候才建立鏈接,進一步提升了性能。

 

3、注意事項

 

有幾點須要注意:

  • 生產環境使用單例的時候,記得最後要close數據庫鏈接。
  • Python並無真正意義上的「私有」元素,我我的以爲其實也不必。提供統一接口已經能夠保證封裝了。至於防止外部修改,我以爲更應該從軟件之外來規定,這不是程序員應該考慮的問題。
  • 單例的典型例子就是數據庫鏈接,不過單例並不僅能應用於數據庫鏈接,但願你們好好把握單例的這種思想。
  • 原書中單例部分還涉及到了線程安全,不過我是搞web開發的,這個問題框架會解決,這裏不深刻討論。

 

下回咱們學習工廠方法。

 

最後,請回答這兩個問題:

單例模式能解決什麼問題?

單例模式是怎麼解決這個問題的?

相關文章
相關標籤/搜索