1. 程式人生 > >設計模式之單例模式(一)

設計模式之單例模式(一)

這篇我們學習的是單例模式,相信很多朋友都或多或少使用過這個模式。很多設計模式的入門,都把單例模式作為第一個的,但是因為我們是跟著書本學習,所以放在了第五個裡面。那麼,你使用過的單例模式是怎麼樣的呢?懶漢式?餓漢式?雙重校驗?靜態?

先來看下定義,單例模式(Singleton Pattern):用來建立獨一無二的,只能有一個例項的物件的入場券。而且,單例模式的類圖是所有設計模式中最簡單的,事實上只有一個類。但是,儘管從類的設計上來說簡單,實現上還是會遇見相當多的波折噢。

單例模式有什麼用處?

有些物件其實我們只需要一個,比方說:執行緒池、快取、對話方塊、處理偏好設定和登錄檔物件、日誌物件等。事實上,這些物件只能以一個例項,如果製造出多個例項,就會導致許多問題的產生,例如:程式的行為異常、資源使用過量,或者就是不一致的結果。

剖析經典的單例模式實現

我們先來看下經典的單例模式的實現程式碼:

public class Singleton {

    private static Singleton uniqueInstance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}
  • 利用一個靜態變數來記錄Singleton類的唯一例項
  • 把構造器宣告為私有化,只有Singleton類才可以呼叫構造器
  • 用getInstance()方法例項化物件,並返回這個例項

再仔細看下getInstance()方法,這裡需要著重描述下。

  1. uniqueInstance 擁有一個“例項”,而且是一個靜態變數
  2. 如果uniqueInstance是空的,表示還沒有建立例項
  3. 如果不存在,我們就利用私有的構造器產生一個Singleton例項並把它賦值到uniqueInstance靜態變數中。請注意,如果我們不需要這個例項,他就永遠不會產生。這就是“延遲例項化”(lazy instaniaze)
  4. 如果uniqueInstance不是null,就表示之前已經建立過物件,我們就直接返回
  5. 當執行到return語句,表示我們已經有例項,並將uniqueInstance當返回值

如果沒有單例模式,這裡有一個程式碼寫的很小心的例子,看完你肯定會感受到單例模式的重要性。

上圖中的公司有意識地防止不好的事情發生,對吧。但是,如果防不勝防,同事存在兩個ChocolateBoiler例項,可能將發生很糟糕的事情。那麼,如果有過個ChocolateBoiler例項存在,可能發生什麼嚴重的事情呢?咋這個例子上,就是會產生資源的浪費,原料的溢位等等。

那麼,你能根據經典的單例模式,寫出這個巧克力工廠的單例模式嗎?我們晚點揭曉。

定義單例模式

單例模式:確保一個類只有一個例項,並提供一個全域性訪問點。

這定義一點兒都不讓人吃驚,但是讓我們更深入一點兒:

  • 到底怎麼回事?我們正在把某個類設計成自己管理的一個單獨例項,同時也避免其他類再自行產生例項。要想取得單例例項,通過單例類是唯一的途徑
  • 我們也提供對這個例項的全域性訪問點:當你需要例項時,向類查詢,他會返回單個例項。前面的例子利用延遲例項化的方式建立單例,這種做法對資源敏感的物件特別重要。

那我們來看看單例的類圖:

你看吧,之前就說過,這個單例模式只有一個類圖,是不是很簡單呢?仔細看看他吧。

但是,這些都只是單執行緒模式下的單例模式,參考上面這個巧克力工廠,如果是多執行緒模式下的單例,那又會是什麼樣的呢?經典的單例模式,能確保你在單執行緒下不出問題,但是,我們想要讓人家效率更高,產量更大,勢必需要多執行緒?

那麼,請螢幕前的你,先好好想想,我們下次學習的時候,通過JVM原理,把這個煩惱給解決了。今天的學習就先到這裡啦。

愛生活,愛學習,愛感悟,愛挨踢

相關推薦

設計模式模式(singtonMode)

參考文章: (1)https://blog.csdn.net/li295214001/article/details/48135939 (2)http://love-love-l.blog.163.com/blog/static/21078304201001804211901/ (3)h

java設計模式建立型模式 模式餓漢式,懶漢式,執行緒安全,雙重檢查

1.介紹     單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。  2.實現思路與步驟   1).將該類的構造方法定義為私有方法,這樣其他處的程式碼就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態

設計模式模式

這篇我們學習的是單例模式,相信很多朋友都或多或少使用過這個模式。很多設計模式的入門,都把單例模式作為第一個的,但是因為我們是跟著書本學習,所以放在了第五個裡面。那麼,你使用過的單例模式是怎麼樣的呢?懶漢式?餓漢式?雙重校驗?靜態? 先來看下定義,單例模式(Singleton Pattern):用來建立獨一無二

JAVA設計模式模式

單例對象 日誌 locking anti 常見 基本上 title 加載 懶漢式 本文繼續介紹23種設計模式系列之單例模式。 概念:  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裏主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特

Java設計模式模式七種寫法

不一定 java設計 font method 防止 turn 無法 lazy 三種 Java設計模式之單例模式(七種寫法) 第一種,懶漢式,lazy初始化,線程不安全,多線程中無法工作: public class Singleton { private stati

python設計模式模式

__new__ 有意 {} 開發人員 sta 字典 spa 出現 創建 上次我們簡單了解了一下什麽是單例模式,今天我們繼續探究。上次的內容點這 python設計模式之單例模式(一) 上次們討論的是GoF的單例設計模式,該模式是指:一個類有且只有一個對象。通常我們需

設計模式 模式懶漢式和餓漢式

設計模式: 一些人總結出來用來解決特定問題的固定的解決方案。 單例模式 解決一個類在記憶體中只存在一個物件,想要保證物件的唯一。 1 為了避免其他程式過多的建立該類物件。禁止其他程式建立該類物件。 2 為了其他程式可以訪問該類物件,在本類中自定義一個物件。 3 方便其他程

設計模式建立型:Java常用23種設計模式模式詳解以及Java程式碼實現

可以說單例模式是所有設計模式中最簡單的一種。 單例模式就是說系統中對於某類的只能有一個物件,不可能出來第二個。 單例模式也是23中設計模式中在面試時少數幾個會要求寫程式碼的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。 1.多執行緒安全單例模式例項一(不使用同步鎖)

設計模式模式關鍵詞:設計模式/模式/單件模式

設計模式 單例模式 定義 單例模式:允許一些物件中只存在 1 個例項。 類裝飾器版本 1:使用 1 個全域性字典,儲存所有類的例項。 instances = {} def getInstances(aClass, *args): if aClass not in i

設計模式模式懶漢式double check

上一篇文章中的懶漢式單例模式採用同步方法保證了執行緒安全,但是開銷很大,每次執行該方法都會檢查鎖。下面採用double check的方式進行改寫,下面這種實現看似可行,實則有缺陷,具體缺陷在後文分析: 注意上面第二幅圖中對lazyDoubleCheckSingl

設計模式模式與工廠模式的Python實現()

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

設計模式模式序列化與反序列化破壞

單例模式的核心是要保證單例,但是在將一個例項序列化到一個檔案中後,再反序列化得到一個例項,這兩個例項是不同的,這就違反了單例原則,如下面惡漢式單例模式對序列化的測試: 由上面的列印資訊可知得到的是兩個不同的例項,通過除錯跟程式碼可以很容易發現,在反序列化時通過反

java 設計模式模式 篇就夠了

單例模式 單例物件(Singleton)是一種常用的設計模式。 在Java應用中,單例物件能保證在一個JVM中,該物件只有一個例項存在。這樣的模式有幾個好處: 1、某些類建立比較頻繁,對於一些大型的

設計模式模式

單例模式 顧名思義,單例模式就是保證某個類只有一個例項。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每臺計算機可以有若干個印表機,但只能有一個Printer Spooler,以避免兩個列印作業同時輸出到印

設計模式模式執行緒安全

可以說單例模式是所有設計模式中最簡單的一種。 單例模式就是說系統中對於某類的只能有一個物件,不可能出來第二個 單例模式也是23種設計模式中在面試時少數幾個會要求寫程式碼的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。 1.多執行緒安全單例模式例項

java設計模式模式幾種寫法及比較

概念:  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裡主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特點:  1、單例類只能有一個例項。  2、單例類必須自己建立自己的唯一例項。  3、單例類必須給所有其他物件提供這一例項。 

C++面試 設計模式模式C++11

單例模式 確保一個類只有一個例項,並提供了一個全域性訪問點。 單例模式,可以說設計模式中最常應用的一種模式了,據說也是面試官最喜歡的題目。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況,可能會優先考慮使用全域性或者靜態變數

設計模式模式懶漢式和餓漢式

設計模式第一個模式通常是單例模式,是為了防止某個類存在多個物件。 程式碼如下: **singlon.h:** #pragma once #ifndef _SINGLON_H #define _SINGLON_H class singlon { publ

設計模式模式C++程式碼實現

1、單例模式: 單例模式:用來建立獨一無二的,只能夠有一個例項的物件。 單例模式的結構是設計模式中最簡單的,但是想要完全實現一個執行緒安全的單例模式還是有很多陷阱的。 2、應用場景: 共享資料或者共享訪問點; 建立一個物件需要消耗的資源過多,如訪問IO和

小白筆記設計模式模式,後續發現問題會進行修改,大神勿噴,謝謝。

提高效率 public code 靜態屬性 懶漢 加載 屬性 設計模式之單例模式 syn 單例模式 package com.bjsxt.thread.syn; /** * 單例創建方式 * 1.懶漢式 * 1)構造器私有化 * 2)聲明私有的靜態變量 * 3)對外