單例模式優點:1、可以確保所有物件都存取唯一實例;2、因為類別控制了實例化過程,所以類別可以靈活更改實例化過程;3、因為只有一個實例,所以減少記憶體開支和系統的效能開銷。
單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類別的一個物件成為系統中的唯一實例。要實現這一點,可以從客戶端對其進行實例化開始。因此需要用一種只允許產生物件類別的唯一實例的機制,「阻止」所有想要生成物件的存取。使用工廠方法來限制實例化製程。這個方法應該是靜態方法(類別方法),因為讓類別的實例去產生另一個唯一實例毫無意義。
單例模式動機
對於系統中的某些類別來說,只有一個實例很重要,例如,一個系統中可以存在多個列印任務,但是只能有一個正在工作的任務;一個系統只能有一個視窗管理器或檔案系統;一個系統只能有一個計時工具或ID(序號)產生器。如在Windows中就只能開啟一個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個窗口,如果這些視窗顯示的內容完全一致,則是重複對象,浪費記憶體資源;如果這些視窗顯示的內容不一致,則表示在某一瞬間系統有多個狀態,與實際不符,也會帶給使用者誤解,不知道哪一個才是真實的狀態。因此有時確保系統中某個物件的唯一性即一個類別只能有一個實例非常重要。 [2]
如何確保一個類別只有一個實例且這個實例容易被存取呢?定義一個全域變數可以確保物件隨時都可以被訪問,但不能防止我們實例化多個物件。一個更好的解決辦法是讓類別本身負責保存它的唯一實例。這個類別可以保證沒有其他實例被創建,並且它可以提供一個訪問該實例的方法。這就是單例模式的模式動機。
單例模式重點
顯然單例模式的要點有三個;一是某個類別只能有一個實例;二是它必須自行建立這個實例;三是它必須自行向整個系統提供這個實例。
從具體實作角度來說,就是以下三點:一是單例模式的類別只提供私有的建構函數,二是類別定義中含有一個該類別的靜態私有對象,三是該類別提供了一個靜態的公有的函數用於建立或取得它本身的靜態私有物件。
在下面的物件圖中,有一個"單例物件",而"客戶甲"、"客戶乙" 和"客戶丙"是單例物件的三個客戶物件。可以看到,所有的客戶物件共享一個單例物件。而且從單例物件到自身的連接線可以看出,單例物件持有對自己的引用。
有些資源管理器常常設計成單例模式。
在電腦系統中,需要管理的資源包括軟體外部資源,譬如每台電腦可以有若干個印表機,但只能有一個Printer Spooler, 以避免兩個列印作業同時輸出到印表機。每台電腦可以有若干傳真卡,但只應該有一個軟體負責管理傳真卡,以避免出現兩份傳真作業同時傳到傳真卡中的情況。每台電腦可以有若干通信端口,系統應集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。
需要管理的資源包括軟體內部資源,譬如,大多數的軟體都有一個(甚至多個)屬性(properties)檔案存放系統配置。這樣的系統應由一個物件來管理一個屬性檔。
需要管理的軟體內部資源也包括譬如負責記錄網站來訪人數的部件,記錄軟體系統內部事件、出錯訊息的部件,或是對系統的表現進行檢查的部件等。這些零件都必須集中管理,不可整出多頭。
這些資源管理器構件必須只有一個實例,這是其一;它們必須自行初始化,這是其二;允許整個系統存取自己這是其三。因此,它們都滿足單例模式的條件,是單例模式的應用。
推薦教學:《PHP》
以上是單例模式優點有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!