1. 程式人生 > >淺談單例模式實際的使用

淺談單例模式實際的使用

前言

單例模式,設計模式中最簡單的一個模式,也是面試中的大熱門。下面是單例模式的定義,來自於百度

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物件例項

常見的單例模式實現

懶漢式單例

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  

    public static Singleton getInstance
() { if (instance == null) { instance = new Singleton(); } return instance; } }

餓漢式單例

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance
() { return instance; } }

我的看法

看完前面內容的人也許會說,這些東西百度一下到處都是了,還有人可能會說懶漢式的例子不是執行緒安全的,甚至還會有人說除了這兩種以外還有好多種。但是如果按照這些來補充,我的這篇東西和百度上那些千律一篇的部落格有什麼區別呢?

前面的內容,我只是簡單地介紹了一下什麼是單例模式。在我看來,單例模式只是在一個一定範圍內確保全域性有且只有一個例項。簡單來說,單例模式就是為了確保唯一性

學習一個設計模式,不是簡單地看完概念,照著別人的程式碼炒了一遍就算了。還需要思考單例模式可以用在什麼場景,在那些框架中使用的單例模式,為什麼要用單例模式?

下面我會圍繞著幾個問題來分析單例模式

JDK中的單例模式

說到JDK中的單例模式就不得不提列舉了,列舉是JDK 1.5提供的新特性,列舉可以看作是一個特殊的類。定義如下(來自於百度):

在數學和電腦科學理論中,一個集的列舉是列出某些有窮序列集的所有成員的程式,或者是一種特定型別物件的計數。這兩種型別經常(但不總是)重疊。

這個定義相當的晦澀,其實簡單來說:列舉就是把一些常量例項化為唯一的物件。例如可以把月份,星期之類的定義成列舉。

除了列舉以外,Class物件也是單例的。

Spring中的單例模式

Spring可以說是最常用的框架,在Spring中把物件封裝成Bean,而有過了解的朋友都知道Spring的Bean有一個屬性scope。而scope有個引數就是singleton,即單例模式。當scope屬性為singleton時,spring容器中就只會存在一個Bean例項。
需要注意的是這個唯一性是靠唯一ID來確保的,即意味著會存在同一個類不同ID的Bean例項。

分散式下的單例模式

分散式可以說是當下很熱門的概念,那麼單例模式在分散式環境下是否依然實用呢?我以分散式Session舉例吧,分散式Session常見的做法就是用一個全域性快取(如Redis)儲存Session物件,多個Web應用共享這個Session物件,這個不就是活生生的單例嗎?還有就是分散式ID某種意義上也可以說是單例模式,起碼生成出來的分散式ID需要全域性唯一。

生活中的單例模式

我算是一個遊戲愛好者,那就以遊戲來舉例吧,一般RPG網路遊戲賬號下都支援多個遊戲角色,但是每個遊戲角色只能允許同一時刻一個地方登陸。有些遊戲甚至一個賬號只能由在一個地方登陸。

如果上面的例子不夠清晰,我就用我們日常使用的軟體舉例:PC的QQ和移動端的微信也是這樣的,同一時間只能允許一臺裝置登陸。

相關推薦

模式實際的使用

前言 單例模式,設計模式中最簡單的一個模式,也是面試中的大熱門。下面是單例模式的定義,來自於百度 單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只

C#模式

第一次寫部落格,寫的不好休怪哈。 版本1:最簡單的單例模式 方法一: public class MySingleton { private MySingleton() //建構函式,注意private {

模式

之前寫過一篇部落格 《C++單例模式的模板基類》 http://blog.csdn.net/kentzhang_/article/details/48206821  但是,最近才發現實際 上 static  T* Instance() 的實現是有一點bug 的,

(java實現)

前言:        在軟體開發中,各個模組之間如何組織能使我們的系統更加優雅健壯,來保證程式碼具有良好的複用性,擴充套件性以及可讀性,這對軟體設計人員至關重要。於是經過前人反覆推敲,論證,使用之後被大多數人知曉,理解形成一套設計模式體系(一種套路,或者武功祕籍(比如葵

python模式

單例模式 單例模式(Singleton Pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某一個類只有一個例項存在。當你希望在整個系統中,某個類只能出現一個例項時,單例物件就能派上用場。 比如,某個伺服器程式的配置資訊存放在一個檔案中,客戶端通過一個 AppConf

Java設計模式——模式

一、概述         單例模式主要是為了避免因為建立了多個例項造成資源的浪費,且多個例項由於多次呼叫容易導致結果出現錯誤,而使用單例模式能夠保證整個應用中有且只有一個例項。 二、定義 定義:只

模式

class CSingleton /* 懶漢式 */ { public: static CSingleton * GetInstance() // 寫法是在getInstance中new instance然後返回 { if(m_pInstance ==

常見設計模式--模式 簡單工廠模式

今題那站在這裡和大家一起分享最近在一本書上看到的關於設計模式的內容,接下來要講的設計模式有: 單例模式 簡單工廠模式 工廠方法和抽象工廠 代理模式 命令模式 策略模式 門面模式 橋接模式 觀察者模式 接下來詳細介紹滅一種設計模式(注意:下面的講解都是基於ja

java設計模式模式,模板模式,工廠模式,代理模式

這篇文章講述的是java設計模式,包括單例模式、工廠模式、代理模式,如有錯誤或不當之處,希望各位大神批評指正。 什麼是設計模式? 設計模式:是指在大量的理論和實踐中總結和理論化之後,優選的程式碼結構、程式設計風格、以及解決問題的思考模式。正如數學中的公

java設計模式---2種工廠模式模式

1、 工廠模式  。比如有一個統一介面  A   ,這個A介面是一個標準  。如果有類  B  和 C   那麼 BC必須實現A介面  。 我們在以往的 方法生成這種物件的時候   A  b=new  B() ;  A c=new C() ;這樣的方式來的 .但是如果不同的

使用元素的列舉型別實現模式

簡介 通常情況下,我們寫單例模式的時候無非就是三個步驟:構造器私有化,宣告私有靜態變數,提供靜態獲取例項的方法。簡單說就是以下這種方式: class SingletonA { private static SingletonA inst

java模式——優點以及為什麼使用到synchronized

首先 說一下單例模式的好處:減少系統資源的消耗.因為這種工具類基本上貫穿程式始終,必然會頻繁呼叫.如果每一次呼叫都要重新生成例項,帶來的就是 在記憶體堆中,分配一部分記憶體空間.所以這種模式會提高程式的執行速度,減少資源消耗。 可能對於沒有理解單例模式的小夥

設計模式——模式

單例模式   單例模式(Singleton)是一種常用的設計模式,它是建立型模式的一種,適用於一個類有且只有一個例項的情況,也就是說,單例模式確保了某個類只有一個例項(物件)存在。 單例模式定義的三個要素   ① 定義私有的靜態成員。   ② 建構函式私有化。   ③ 提供一個公有的靜態方法以構造例項。 單例

模式(包含三種方式)

  設計模式是一套被反覆使用,多數人知曉,經過分類編目的,程式碼設計的總結,也可以說是前人的智慧結晶。學習設計模式能讓我們對一些應用場景使用相同的套路達到很好的效果,我會不定時更新一些自己對設計模式的理解的文章,從定義,實現,應用場景來說說設計模式,今天我要說的物件是單例模式一,定義  什麼是單例模式,字面理

[Xcode10 實際操作]七、檔案與資料-(15)模式的使用

本文將演示單例物件的使用。 在專案名稱上點選滑鼠右鍵,彈出右鍵選單,選擇【New File】新建檔案命令, 在彈出的模板選項視窗中,選擇【Swift】檔案選項,建立一個單例類檔案。 ->【Next】->在儲存為輸入框內,輸入屬性列表檔案的名稱, 【Save As】:SingletonCla

模式

 圖解單例模式   包含的角色 Singleton:單例 優缺點      優點:                  提供了對唯一

3.5 模式在資料庫連線池管理中的實際應用

目前大多數程式開發都需要用到資料庫連線池,在資料庫連線池的管理類中,就使用了單例模式,來實現對連線池的管理。這裡模擬一個連線池的 管理類Manager.java,它的示意程式碼如下: //***Manage.java********************

模式串字串匹配演算法(KMP)

字串演算法很有趣,尤其是KMP和AC自動機~~ 大綱 1.問題定義 字串匹配是電腦科學中最古老、研究最廣泛的問題之一。一個字串是一個定義在有限字母表∑上的字元序列。例如,ATCTAGAGA是字母表∑ = {A,C,G,T}上的一個字串。字串匹配問題就是在一個大的字串

Java設計模式——例項、簡單工廠、抽象工廠、觀察者

最近的專案裡面涉及到一些Java設計模式,在此簡單談一下自己的看法,以下示例一部分參考同行,大部分自己設計。 1.單例模式 如果一個類始終只能建立一個例項,則這個類成為單例類,這種設計模式稱為單例模式。 class Singleton {

設計模式-模式(Singleton)在Android中的應用場景和實際使用遇到的問題

介紹 在上篇部落格中詳細說明了各種單例的寫法和問題。這篇主要介紹單例在Android開發中的各種應用場景以及和靜態類方法的對比考慮,舉實際例子說明。 單例的思考 寫了這麼多單例,都快忘記我們到底為什麼需要單例,複習單例的本質 單例的本質:控制例