設計模式之單例模式

先說說爲何要開始學習設計模式

工做已經一年之久,不少時間心思大多都花在需求的完成上,需求的完成度很高,可是設計呢?數據庫

有沒有考慮過你所實現的代碼是否有設計在其中呢?設計模式

若是沒有的話接下來和我一塊兒學習設計模式哈~(不必定學習了設計模式就能提升你的設計,可是總歸會有幫助)安全

什麼是設計模式

設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結,使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。多線程

設計模式的分類

按目的分類:工具

  • 建立型:主要用於建立對象。
  • 結構型:主要用於處理類或對象的組合。
  • 行爲型:主要用於描述對類或對象怎樣交互和怎樣分配職責。

按範圍分類:(模式主要是用於處理類之間關係仍是處理對象之間的關係)學習

  • 類模型:處理類和子類之間的關係,這些關係經過繼承創建,在編譯時刻就被肯定下來,是屬於靜態的。
  • 對象模型:處理對象間的關係,這些關係在運行時刻變化,更具動態性。

大概介紹了一些知識點,接下里咱們進入設計模式的學習--單例模式

單例模式的定義

確保某一個類只有一個實例,並且自行實例化並向整個系統提供這個實例,這個類稱爲單例類,它提供全局訪問的方法。 單例模式是一種對象建立型模式。網站

從他的定義咱們能夠看到有三個特色:spa

  • 實例惟一
  • 自行建立
  • 全局訪問

讓咱們看看單例模式的類圖是什麼樣子

咱們能夠看到:一個私有的當前類型的成員變量,一個私有的構造方法,一個 getInstance 方法。

建立對象再也不經過new 而經過 getInstance 讓該類自行建立。線程

接下來就是單例模式的實現啦

給你們介紹幾種可用的單例模式的實現:設計

一 餓漢式(靜態常量)

/**
 * 餓漢式(靜態常量)
 */
class Singleton {
    private static final Singleton Instance = new Singleton();

    static Singleton getInstance() {
        return Instance;
    }

    private Singleton() {
    }
}
複製代碼

優勢:簡單,使用時沒有延遲;在類裝載時就完成實例化,天生的線程安全

缺點:沒有懶加載,啓動較慢;若是從始至終都沒使用過這個實例,則會形成內存的浪費。

二 餓漢式(靜態代碼塊)

/**
 * 餓漢式(靜態代碼塊)
 */
class Singleton {
    private static Singleton Instance;

    static {
        Instance = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getInstance() {
        return Instance;
    }
}
複製代碼

這種是將類實例化的過程放在了靜態代碼塊中,在類裝載的時執行靜態代碼塊中的代碼,初始化類的實例。

優缺點同上。

3、雙重檢查(DCL)

/**
 * 雙重檢查(DCL)
 */
public class Singleton {

    private static volatile Singleton Instance;

    private King() {
    }

    public static Singleton getKingInstance() {
        if (Instance == null) {
            synchronized (Singleton.class) {
                if (Instance == null){
                    Instance = new Singleton();
                }
            }
        }
        return Instance;
    }
}
複製代碼

優勢:線程安全;延遲加載;效率較高。

缺點:JDK < 1.5 的時候不可用

如今你們基本都是jdk1.8,因此也不存在這個問題。那爲何不可用呢?你們能夠學習一下哈

使用場景

咱們學習了怎麼實現,那何時咱們須要採用單例模式呢?

單例模式只容許建立一個對象,所以節省內存,加快對象訪問速度,所以對象須要被公用的場合適合使用,如多個模塊使用同一個數據源鏈接對象等等。好比:

  • 須要頻繁實例化而後銷燬的對象
  • 建立對象時耗時過多或者耗資源過多,但又常常用到的對象
  • 有狀態的工具類對象
  • 頻繁訪問數據庫或文件的對象

給你們介紹下具體的使用場景:

  • 好比網站的計數器,通常也是採用單例模式實現,不然難以同步
  • 多線程的線程池的設計通常也是採用單例模式,這是因爲線程池要方便對池中的線程進行控制
  • 數據庫鏈接池的設計通常也是採用單例模式,由於數據庫鏈接是一種數據庫資源。主要是節省打開或者關閉數據庫鏈接所引發的效率損耗
  • ...

這是幾個比較經常使用的,你們能夠參考這些想一下在本身的項目中是否採用了單例模式呢?又或者哪裏也可使用單例模式呢?

概述

其實單例模式的實現還有其餘的實現方式,好比線程安全等等的,可是根據各方面,效率等因素,不推薦使用。

因此我在這裏就只總結幾個推薦你們使用的單例模式的實現。但願對你們有用。

相關文章
相關標籤/搜索