大話設計模式之愛你一萬年:第二章 創建型模式:單例模式::我的女朋友只有你一個:3.4.5.單例模式的實現-餓漢/靜態/枚舉

2021-02-19 SpringBoot

相關歷史文章(閱讀本文前,您可能需要先看下之前的系列👇

國內最全的Spring Boot系列之三

2020上半年發文匯總「值得收藏」

SpringBoot框架開發的優秀的項目「值得收藏學習」 - 第335

1天學會別人1個月學會的設計模式

大話設計模式之愛你一萬年:第一章 設計模式基本概念:

大話設計模式之愛你一萬年:第一章 設計模式基本概念:2.GoF的23種設計模式的分類和功能

大話設計模式之愛你一萬年:第一章 設計模式基本概念:3.設計模式的六大原則

大話設計模式之愛你一萬年:第二章 創建型模式:單例模式::我的女朋友只有你一個:1.單例模式的基本概念

大話設計模式之愛你一萬年:第二章 創建型模式:單例模式::我的女朋友只有你一個:2.單例模式的實現-懶漢模式

3. 單例模式的實現-餓漢模式

學習了懶漢模式的實現單例方式,那麼餓漢模式So easy了。

一、單例模式-餓漢模式

1.1 定義

       類加載的初始化階段就完成了類的實例化

(1)類的初始化:是完成程序執行前的準備工作。在這個階段,靜態的(變量,方法,代碼塊)會被執行。同時在會開闢一塊存儲空間用來存放靜態的數據。初始化只在類加載的時候執行一次。

(2)類的實例化:是指創建一個對象的過程。這個過程中會在堆中開闢內存,將一些非靜態的方法,變量存放在裡面。在程序執行的過程中,可以創建多個對象,既多次實例化。每次實例化都會開闢一塊新的內存。

 

1.2 實現

       在定義靜態屬性的時候,就使用new將對象進行創建。具體的GirlFirend代碼如下:

package com.kfit.singleton.hungry;
public class GirlFriend { private static GirlFriend instance = new GirlFriend();

public static GirlFriend getInstance() { return instance; }
public void playWithMe(){ System.out.println("女朋友陪我玩 - 有一個女朋友真好"); }
public void shoppingWithMe(){ System.out.println("陪女朋友去購物 - 我已經是快四大皆空了(支付寶、微信錢包、銀行卡、錢包 都空空如也了)"); }}

二、單例模式-餓漢模式:小結

餓漢模式:類加載的初始化階段就完成了類的實例化

(1)避免new對象:構造方法私有化。

(2)線程安全問題:利用JVM類加載機制來保證線程安全問題。

(3)如何確保唯一性:藉助JVM類加載機制,保證實例的唯一性。

(4)什麼時候被實例化的:在類加載的最後一步類的初始化(只有在真正使用對應的類的時候,才會觸發類加載進行初始化,對靜態變量進行類的實例化)。

(5)類什麼時候會被加載:當我們調用GirlFriend.getInstance()的時候,會判斷類型GirlFriend類是否已經被加載了,沒有被加載的話,就會執行JVM的類加載過程(加載-驗證-準備-解析-初始化)。

4. 單例模式的實現-靜態內部類-懶加載的一種方式

接下來我們來看下靜態內部類的實現方式:

 

一、單例模式-靜態內部類

1.1 定義

       使用類的靜態內部類持有靜態對象的方式來實現單例,屬於懶加載的一種實現。

1.2 實現

       在單例的類中,需要定義一個靜態內部類,在靜態內部類進行定義一個外部類的靜態變量,並且使用new進行對象的創建。具體代碼如下:

package com.kfit.singleton.innerclass;
public class GirlFriend {

public void playWithMe(){ System.out.println("女朋友陪我玩 - 有一個女朋友真好"); }
public void shoppingWithMe(){ System.out.println("陪女朋友去購物 - 我已經是快四大皆空了(支付寶、微信錢包、銀行卡、錢包 都空空如也了)"); }
private GirlFriend() { }

private static class InnerClassHolder{ private static GirlFriend instance = new GirlFriend(); }


public static GirlFriend getInstance(){ return InnerClassHolder.instance; }}

二、單例模式-靜態內部類:小結

靜態內部類:使用類的靜態內部類持有靜態對象的方式來實現單例,屬於懶加載的一種實現。

(1)避免new對象:構造方法私有化。

(2)線程安全問題:利用JVM類加載機制來保證線程安全問題。

(3)如何確保唯一性:藉助JVM類加載機制,保證實例的唯一性。

(4)什麼時候被實例化的:在執行返回InnerClassHolder.instance的時候觸發類加載機制進行加載InnerClassHolder進行初始化,從而對GirlFriend進行實例化。

 

5. 單例模式的實現-枚舉類型

這一節我們看下通過枚舉類型來實現的單例。

 

一、單例模式-枚舉類型

1.1 定義

       通過枚舉類型的特殊性,直接定義屬性就是當前的實例對象來進行單例的實現。

1.2 實現

       直接定義枚舉類即可:

GirlFriend的代碼:

package com.kfit.singleton.enumsingleton;
public enum GirlFriend { INSTANCE;
public void playWithMe(){ System.out.println("女朋友陪我玩 - 有一個女朋友真好"); }
public void shoppingWithMe(){ System.out.println("陪女朋友去購物 - 我已經是快四大皆空了(支付寶、微信錢包、銀行卡、錢包 都空空如也了)"); }}

測試代碼:


public class Test { public static void main(String[] args) {
GirlFriend girlFriend = GirlFriend.INSTANCE; GirlFriend girlFriend2 = GirlFriend.INSTANCE; System.out.println(girlFriend==girlFriend2); }}

二、單例模式-枚舉類型:小結

       枚舉類型:通過枚舉類型的特殊性,直接定義屬性就是當前的實例對象來進行單例的實現。

(1)避免new對象:枚舉類型的特性,不能直接new。

(2)線程安全問題:利用JVM類加載機制來保證線程安全問題。

(3)如何確保唯一性:藉助JVM類加載機制,保證實例的唯一性。

(4)什麼時候實例化的:在類加載的時候會執行靜態代碼塊進行實例化。

我就是我,是顏色不一樣的煙火。
我就是我,是與眾不同的小蘋果。

à悟空學院:https://t.cn/Rg3fKJD

學院中有Spring Boot相關的課程!點擊「閱讀原文」進行查看!

SpringBoot視頻:http://t.cn/A6ZagYTi

SpringBoot交流平臺:https://t.cn/R3QDhU0

SpringSecurity5.0視頻:http://t.cn/A6ZadMBe

ShardingJDBC分庫分表:http://t.cn/A6ZarrqS

分布式事務解決方案:http://t.cn/A6ZaBnIr

JVM內存模型調優實戰:http://t.cn/A6wWMVqG

Spring入門到精通:https://t.cn/A6bFcDh4

大話設計模式之愛你:https://dwz.cn/wqO0MAy7

相關焦點

  • 設計模式一:單例模式
    什麼是單例模式單例模式是指系統中的某個類只能有一個對象實例。
  • Android設計模式(1)——單例模式
    單例模式使用的場景確保某個類有且只有一個對象的場景,避免產生多個對象消耗過多的資源,或者某種類型對象只應該有且只有一個,例如,創建一個對象需要消耗的資源過多,,如要訪問IO和資料庫等資源,這時就需要考慮使用單例模式。
  • 深入解析單例模式的七種實現
    來源:http://t.cn/E4J3ffX什麼是單例模式如何實現單例模式呢?單例模式的七種實現總結什麼是單例模式什麼是單例模式呢?我們引用一下維基百科:單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統只需要擁有一個的全局對象,這樣有利於我們協調系統整體的行為。
  • 設計模式:單例模式
    基本概念1.1 原理單例模式可以說是所有設計模式中最簡單的一個了,這裡我們先直接給出它的概念然後再對它進行詳細的講解。單例模式就是:一個類只能有一個實例,並提供對該實例的全局訪問點。通俗地說,就是一個類只能創建一個對象,並且在程序的任何地方都能夠訪問到該對象。在某些情況下一些類只需要一個實例就夠了,我們以一個簡化的文件管理器作為例子來說明。
  • 大話設計模式之愛你一萬年:第一章 設計模式基本概念:2.GoF的23種設計模式的分類和功能
    框架開發的優秀的項目「值得收藏學習」 - 第3351天學會別人1個月學會的設計模式大話設計模式之愛你一萬年:第一章 設計模式基本概念:一、設計模式的分類設計模式有兩種分類方法,根據模式的[目的]和模式的[
  • 單例模式襲來
    吹一波單例模式❝確保某個類只有一個實例,而且自行實例化並向整個系統提供整個實例。說白了,就是"獨苗"!什麼是"自行實例化"?就是整個實例是在類內部自己創建的,不是在別的類中創建的。❞單例誰都會寫,而且五花八門,且隨洒家來瞅瞅。
  • Java的單例模式
    一、什麼是單例模式?
  • 手寫單例模式
    這樣我們就保證一個在全局使用的類不被頻繁的創建與銷毀,節省系統資源。實現單例模式的三大要點: 1、首先要確保全局只有一個類的實例。餓漢模式--靜態代碼塊方式--靜態代碼塊方式(線程安全)其實就是上面靜態常量餓漢式 實現上稍微變動一下,將類的實例化放到了靜態代碼塊中而已。
  • 一文帶你讀懂單例模式
    單例模式單例模式可以說是設計模式中最簡單的一個了,它屬於創建型模式,其定義如下:單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統只需要擁有一個的全局對象,這樣有利於我們協調系統整體的行為。
  • 再見面試官:單例模式有幾種寫法?
    ;  }}相對於餓漢模式,Holder模式僅增加了一個靜態內部類的成本,與飽漢的變種3效果相當(略優),都是比較受歡迎的實現方式。枚舉模式用枚舉實現單例模式,相當好用,但可讀性是不存在的。但用戶只能直接訪問實例Singleton4.SINGLETON——事實上,這樣的訪問方式作為單例使用也是恰當的,只是犧牲了靜態工廠方法的優點,如無法實現懶加載。醜陋但好用的語法糖Java的枚舉是一個「醜陋但好用的語法糖」。
  • Java 實現單例模式的 9 種方法
    來源:http://t.cn/EbMp32y一. 什麼是單例模式二. 單例模式的特點三. 單例模式VS靜態類四. 單例模式的實現一. 什麼是單例模式因進程需要,有時我們只需要某個類同時保留一個對象,不希望有更多對象,此時,我們則應考慮單例模式的設計。二.
  • Java單例模式深入詳解
    一.問題引入偶然想想到的如果把Java的構造方法弄成private,那裡面的成員屬性是不是只有通過static來訪問呢;如果構造方法是private的話,那麼有什麼好處呢;如果構造方法是private的話,會不更好的封裝該內呢?我主要是應用在使用普通類模擬枚舉類型裡,後來發現這就是傳說中的單例模式。
  • 我向面試官講解了單例模式,他對我豎起了大拇指
    什麼是單例模式面試官問什麼是單例模式時,千萬不要答非所問,給出單例模式有兩種類型之類的回答,要圍繞單例模式的定義去展開。單例模式是指在內存中只會創建且僅創建一次對象的設計模式。在程序中多次使用同一個對象且作用相同時,為了防止頻繁地創建對象使得內存飆升,單例模式可以讓程序僅在內存中創建一個對象,讓所有需要調用的地方都共享這一單例對象。
  • Python設計模式之單例模式
    Pattern)是最常用的一種設計模式,是一種非常常用的創建型設計模式。什麼場景會用到單例模式呢?就是在系統工程中只想創建單個實例對象,比如資料庫連接池,Redis連接池,服務監控中心等。這個場景下,如果存在多個實例對象,那麼會有無法預測的異常。同時,在設計單例模式時,需要考慮的很重要的因素就是並發性,即多線程調用時是否會存在多個線程。那麼,如何設計使用單例模式呢?
  • java設計模式中的單例模式,收藏起來慢慢看!
    在java中,單例模式算是比較基礎和簡單的,今天就來簡單聊聊什麼是單例模式。比如說,一個應用程式中,某個類的實例對象只有一個,而我們沒有辦法new,因為構造器已經被private聲明了,通過getInstance()的方法可以獲取它們的實例。
  • 高並發下線程安全的單例模式(最全最經典,值得收藏)
    在所有的設計模式中,單例模式是我們在項目開發中最為常見的設計模式之一,而單例模式有很多種實現方式,你是否都了解呢?高並發下如何保證單例模式的線程安全性呢?如何保證序列化後的單例對象在反序列化後任然是單例的呢?這些問題在看了本文之後都會一一的告訴你答案,趕快來閱讀吧!什麼是單例模式?
  • 《java多線程編程核心技術》之單例模式
    相關概念立即加載/餓漢模式使用類的時候已將對象創建完畢,常見的實現辦法就是直接new實例化private static MyObject myObject = new MyObjectsynchronized,可能創建N個對象if (myObject == null)myObject = new MyObject();return myObject;}多線程下的單例解決方案
  • 【設計模式】各個擊破單例模式的8種寫法
    單例模式在一個系統開發過程中,我們在基於節省內存資源、保證數據內容的一致性的考慮上,往往需要對某些類要求只能創建一個實例,即「保證類只有一個實例」的設計模式就是單例模式。比如我們遇到過的各種Manager管理類,各種Factory工廠類;Spring 框架應用中的 ApplicationContext、資料庫中的連接池等也都是單例模式。本文旨在淺析一下單例模式的寫法。單例模式的8種寫法1. 餓
  • 設計模式大冒險第四關:單例模式,如何成為你的「唯一」
    這一篇文章是關於設計模式大冒險系列的第四篇文章,這一系列的每一篇文章我都希望能夠通過通俗易懂的語言描述或者日常生活中的小例子來幫助大家理解好每一種設計模式。今天這篇文章來跟大家一起學習一下單例模式。相信讀完這篇文章之後,你肯定會有所收穫的。關於單例模式,這應該是設計模式中最簡單的一種了。
  • 單例模式絕對沒有想像的那麼簡單!不服來看!
    一、前言單例模式(Singleton Pattern)是 Java 中最常用的設計模式之一,同時也是面試的重災區。有些人可能覺的單例模式很簡單,沒有什麼難的。其實不然,因為牽扯到線程安全的問題,所以單例模式絕對能體現出你的功底。不信接著往下看。