1. 程式人生 > >單例模式深入研究

單例模式深入研究

       單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界 訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在一個,單例模式是最好的解決方案。

 

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

Static uniqueInstance是singleton的唯一例項, static sharedInstance將把它返回客戶端。通常,sharedInstance會檢查uniqueInstance是否已經被例項化。如果沒有,它 會生成一個例項然後返回uniqueInstance。



 

動機

對 於系統中的某些類來說,只有一個例項很重要,例如,一個系統中可以存在多個列印任務,但是隻能有一個正在工作的任務;一個系統只能有一個視窗管理器或檔案 系統;一個系統只能有一個計時工具或ID(序號)生成器。如在Windows中就只能開啟一個工作管理員。如果不使用機制對視窗物件進行唯一化,將彈出多 個視窗,如果這些視窗顯示的內容完全一致,則是重複物件,浪費記憶體資源;如果這些視窗顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符, 也會給使用者帶來誤解,不知道哪一個才是真實的狀態。因此有時確保系統中某個物件的唯一性即一個類只能有一個例項非常重要。 如何保證一個類只有一個例項並且這個例項易於被訪問呢?定義一個全域性變數可以確保物件隨時都可以被訪問,但不能防止 我們例項化多個物件。一個更好的解決辦法是讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項被建立,並且它可以提供一個訪問該例項的方法。這就 是單例模式的模式動機。

要點

顯然單例模式的要點有三個;一是某個類只能有一個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。 從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的建構函式,二是類定義中含有一個該類的靜態私有物件,三是該類提供了一個靜態的共有的函式用於建立或獲取它本身的靜態私有物件。

優缺點

優點

一、例項控制 單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。 二、靈活性 因為類控制了例項化過程,所以類可以靈活更改例項化過程。

缺點

一、開銷 雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。 二、可能的開發混淆
使用單例物件(尤其在類庫中定義的物件)時,開發人員必須記住自己不能使用new關鍵字例項化物件。因為可能無法訪問庫原始碼,因此應用程式開發人員可能會意外發現自己無法直接例項化此類。

例項

Java中的單例模式

在java中,可以使用以下這種方式使用單例模式建立類的例項: public class MyBean { private static MyBean instance = null; private MyBean(){ //do something } public static synchronized MyBean getInstance(){ if(instance == null){ instance = new MyBean(); } return instance; } } 當一個類的例項可以有且只可以一個的時候就需要用到了。為什麼只需要有一個呢?有人說是為了節約記憶體,但這只是單例模式帶來的一個好處。只有一個例項確實減少記憶體佔用,可是我認為這不是使用單例模式的理由。我認為使用單例模式的時機是當例項存在多個會引起程式邏輯錯誤的時候。比如類似有序的號碼生成器這樣的東西,怎麼可以允許一個應用上存在多個呢? Singleton模式主要作用是保證在Java應用程式中,一個類Class只有一個例項存在。 一般Singleton模式通常有三種形式: 第一種形式: 也是常用的形式。 public class Singleton { private static Singleton instance = null; private Singleton(){ //do something } public static Singleton getInstance(){ if(instance==null){ instance = new Singleton(); } return instance; } } 第二種形式: public class Singleton { //在自己內部定義自己的一個例項,只供內部呼叫 private static Singleton instance = new Singleton(); private Singleton(){ //do something } //這裡提供了一個供外部訪問本class的靜態方法,可以直接訪問 public static Singleton getInstance(){ return instance; } } 第三種形式: 雙重鎖的形式。 public class Singleton { private static Singleton instance = null; private Singleton(){ //do something } public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(null == instance){ instance = new Singleton(); } } } return instance; } }//這個模式將同步內容下方到if內部,提高了執行的效率,不必每次獲取物件時都進行同步,只有第一次才同步,建立了以後就沒必要了。

相關推薦

模式深入研究

       單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界 訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在一個,單例模式是最好的解決方案。  單例模式是設計模式中最簡單的形

Java模式深入詳解

protected test 異常 except while 深入 bject his 不一致 Java單例模式深入詳解 一.問題引入   偶然想想到的如果把Java的構造方法弄成private,那裏面的成員屬性是不是只有通過static來訪問呢;如果構造方法是privat

模式深入理解(轉)

一. 什麼是單例模式因程式需要,有時我們只需要某個類同時保留一個物件,不希望有更多物件,此時,我們則應考慮單例模式的設計。二. 單例模式的特點1. 單例模式只能有一個例項。2. 單例類必須建立自己的唯一例項。3. 單例類必須向其他物件提供這一例項。三. 單例模式VS靜態類在知道了什麼是單例模式後,我想你一定會

深入模式

class Singleton(object): def __init__(self): pass @classmethod def instance(cls, *args, **kwargs): if not hasattr(Single

深入理解模式(上)

最近在閱讀《 》這本書,第3個條款專門提到了單例屬性,並給出了使用單例的最佳實踐建議。讓我對這個單例模式(原本我以為是設計模式中最簡單的一種)有了更深的認識。 單例模式 單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種型別的設計模式屬

深入理解模式:靜態內部類原理

這樣的 加載 hand 優點 傳遞 多個 喚醒 ref 一個   本文主要介紹java的單例模式,以及詳細剖析靜態內部類之所以能夠實現單例的原理。OK,廢話不多說,進入正文。    首先我們要先了解下單例的四大原則:    1.構造私有。    2.以靜態方法或者枚舉返回實

模式-解構函式的深入理解

singleton單例模式 單件模式      保證一個類中僅有一個例項,並且提供一個訪問他的全域性訪問點 a. 懶漢式:使用的時候才建立,多執行緒訪問的時候執行緒不安全(雙檢鎖) b. 餓漢式:類檔案載入的時候已經建立好了物件,如果物件一直沒有

深入理解模式的幾種實現方式

前言 單例模式是一種很常用的設計模式,其定義是單例物件的類只允許有一個例項存在。在使用spring自動建立物件時預設就是單例的。 使用場景 需要頻繁的對物件進行建立與銷燬,如果工具類物件 一、餓漢式(靜態變數) public class Singleton1 { private st

讀《深入 PHP 面向物件、模式與實踐》2,模式

1,單例模式,138頁     問題:一個物件應該可以被系統中的任何物件使用。         這個物件不應該被儲存在會被覆寫的全域性變數中。         系統

深入理解模式——只有一個例項

目錄: 前言 初遇設計模式在上個寒假,當時把每個設計模式過了一遍,對設計模式有了一個最初級的瞭解。這個學期借了幾本設計模式的書籍看,聽了老師的設計模式課,對設計模式算是有個更進一步的認識。後面可能會不定期更新一下自己對於設計模式的理解。每個設計模式看似很簡單,

模式在多執行緒中的安全性研究

概述 關於一般單例模式的建立和分析在我的另一篇部落格《Java設計模式——單件模式》中有詳細說明。只是在上篇部落格中的單例是針對於單執行緒的操作,而對於多執行緒卻並不適用,本文就從單例模式與多執行緒安全的角度出發,講解單例模式在多執行緒中應該如何被使用。

【Java】設計模式深入理解模式

什麼是設計模式?簡單的理解就是前人留下來的一些經驗總結而已,然後把這些經驗起了個名字叫Design Pattern,翻譯過來就是設計模式,通過使用設計模式可以讓我們的程式碼複用性更高,可維護性更高,讓你的程式碼寫的更優雅。設計模式理論上有23種,今天就先來

深入理解模式

在GoF的23種設計模式中,單例模式是比較簡單的一種。然而,有時候越是簡單的東西越容易出現問題。下面就單例設計模式詳細的探討一下。 所謂單例模式,簡單來說,就是在整個應用中保證只有一個類的例項存在。就像是Java Web中的application,也就是提供了一個全域性變數,用處相當廣泛,比如儲存全域性資

深入理解PHP模式的實現&static&clone

前提 提到單例模式,那就不得不說設計模式。 單例模式是最簡單的一種設計模式,提供了一種唯一訪問其物件的方式,可以直接訪問。 屬於建立型模式 實現之前,我們先要明白兩個關鍵字的原理 static 宣告類屬性或方法為靜態,就可以不例項化類而直接訪問。靜態屬性不能通過一

C++深入理解模式詳解

作者:知乎使用者連結:https://www.zhihu.com/question/27704562/answer/37760739來源:知乎著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。不使用編譯器擴充套件,不用C++11,不加鎖,也不使用原子操作的話

Java模式之懶漢式的深入瞭解

Singleton通過將構造方法限定為private避免了類在外部被例項化,在同一個虛擬機器範圍內,Singleton的唯一例項只能通過getInstance()方法訪問。 (事實上,通過Java反射機制是能夠例項化構造方法為private的類的,那基本上會使所有的Java單例實現失效。此問題在此處不做

深入Java模式

在GoF的23種設計模式中,單例模式是比較簡單的一種。然而,有時候越是簡單的東西越容易出現問題。下面就單例設計模式詳細的探討一下。 所謂單例模式,簡單來說,就是在整個應用中保證只有一個類的例項存在。就像是Java Web中的application,也就是提供了一個全域性變數,用處相當廣泛,比如儲存全域性資

深入理解 JavaScript 模式 (Singleton Pattern)

概念 單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例物件的類必須保證只有一個例項存在。 核心:確保只有一個例項,並提供全域性訪問。 實現思路 一個類能返回物件一個引用(永遠是同一個)和一個獲得該例項的方法(必須是靜態方法,通常命名為getIntance);當我們呼叫這個方法時,類

深入探索Java設計模式模式

單例模式可確保在給定的時間例項中只能建立一個具有全域性訪問點的物件。這是面向物件程式設計中最常用的技術之一。儘管它很簡單,但從類設計的角度來看可能是最簡單的,但是在嘗試實現它們之前,必須先解決一些細微的問題。本文是在學習完優銳課JAVA架構VIP課程—【框架原始碼專題】中《學習原始碼中的優秀設計模式》後寫下的

深入探討模式

最近學習了一下單例模式,看bilibili up主“狂神說Java”講完後,發現大部分部落格都少了一個很有趣的環節,不分享出來實在是太可惜了,原視訊 https://www.bilibili.com/video/BV1K54y197iS 1、瞭解單例 這個部分小部分我相信很多部落格都講的很好,我就儘量精簡