單例設計模式

2022-09-08 10:06:09 字數 2353 閱讀 4044

一. 概述

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中一類只有乙個例項而且該例項易於外界訪問,從而達到使用目的(如windows作業系統中,任務管理器只能開啟乙個--主要目的),同時還能方便對例項個數的控制並節約系統資源(主要目的之外的好處)。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。

二. 簡介

單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類的乙個物件成為系統中的唯一例項。要實現這一點,可以從客戶端對其進行例項化開始。因此需要用一種只允許生成物件類的唯一例項的機制,「阻止」所有想要生成物件的訪問。使用工廠方法來限制例項化過程。這個方法應該是靜態方法(類方法),因為讓類的例項去生成另乙個唯一例項毫無意義。

三. 定義

j**a中單例模式的定義:乙個類有且僅有乙個例項,並且自行例項化向整個系統提供。

四. 動機

對於系統中的某些類來說,只有乙個例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在工作的任務;乙個系統只能有乙個視窗管理器或檔案系統;乙個系統只能有乙個計時工具或id(序號)生成器。如在windows中就只能開啟乙個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個視窗,如果這些視窗顯示的內容完全一致,則是重複物件,浪費記憶體資源;如果這些視窗顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給使用者帶來誤解,不知道哪乙個才是真實的狀態。因此有時確保系統中某個物件的唯一性即乙個類只能有乙個例項非常重要。

如何保證乙個類只有乙個例項並且這個例項易於被訪問呢?定義乙個全域性變數可以確保物件隨時都可以被訪問,但不能防止我們例項化多個物件。乙個更好的解決辦法是讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項被建立,並且它可以提供乙個訪問該例項的方法。這就是單例模式的模式動機

五. 要點  

顯然單例模式的要點有三個:

1. 是某個類只能有乙個例項;

2. 是它必須自行建立這個例項;

3. 是它必須自行向整個系統提供這個例項。

從具體實現角度來說,就是以下三點:

1. 是單例模式的類只提供私有的建構函式;

2. 是類定義中含有乙個該類的靜態私有物件;

3. 是該類提供了乙個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。

六. 例項  

當乙個類的例項可以有且只有乙個的時候就需要用到了。為什麼只需要有乙個呢?有人說是為了節約記憶體,但這只是單例模式帶來的乙個好處。只有乙個例項確實減少記憶體占用,可是我認為這不是使用單例模式的理由。我認為使用單例模式的時機是當例項存在多個會引起程式邏輯錯誤的時候。比如類似有序的號碼生成器這樣的東西,怎麼可以允許乙個應用上存在多個呢?singleton模式主要作用是保證在j**a應用程式中,乙個類class只有乙個例項存在。

1. 懶漢式    

所謂「懶漢式」與「餓漢式」的區別,是在於建立單例物件的時間不同。「懶漢式」是在你真正用到的時候才去建這個單例物件:

1 public class singletonclass

12 }

13 return instance;

14 }

15 private singletonclass()

17 }

2. 餓漢式:

餓漢式:在不管你用的用不上,一開始就建立這個單例物件。

1 //對第一行static的一些解釋

2 // j**a允許我們在乙個類裡面定義靜態類。比如內部類(nested class)。

3 //把nested class封閉起來的類叫外部類。

4 //在j**a中,我們不能用static修飾頂級類(top level class)。

5 //只有內部類可以為static。

6 public static class singleton

13 //這裡提供了乙個供外部訪問本class的靜態方法,可以直接訪問

14 public static singleton getinstance()

17 }

3. 雙重鎖的形式

publicstaticclass singleton

public static singleton getinstance()}}

return instance;}}

七. 補充synchronized()的作用?

單例設計模式(餓漢單例設計模式 懶漢單例設計模式)

1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...

設計模式 單例設計模式

歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...

設計模式 單例設計模式

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...