設計模式在Java中的應用:從單例模式到工廠模式的全面解析!

全文目錄:

    • 開篇語
    • 前言
    • 1. 單例模式:確保全局只有一個實例
      • 1.1 餓漢式單例
      • 1.2 懶漢式單例
      • 1.3 雙重檢查鎖定(DCL)
    • 2. 工廠模式:簡化對象創建
      • 2.1 簡單工廠模式
      • 2.2 工廠方法模式
      • 2.3 抽象工廠模式
    • 3. 其他設計模式
      • 3.1 觀察者模式
      • 3.2 策略模式
      • 3.3 適配器模式
    • 4. 結語
    • 文末

開篇語

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云/阿里云/華為云/51CTO;歡迎大家常來逛逛

??今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一個人雖可以走的更快,但一群人可以走的更遠。

??我是一名后端開發愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業余時間把自己所學到所會的,通過文章的形式進行輸出,希望以這種方式幫助到更多的初學者或者想入門的小伙伴們,同時也能對自己的技術進行沉淀,加以復盤,查缺補漏。

小伙伴們在批閱的過程中,如果覺得文章不錯,歡迎點贊、收藏、關注哦。三連即是對作者我寫作道路上最好的鼓勵與支持!

前言

設計模式,是面向對象設計中的“秘籍”,幫助我們解決程序設計中遇到的一些常見問題。它們是基于多年開發經驗總結出來的解決方案,不僅能提升代碼的復用性、可維護性和擴展性,還能使我們在開發過程中避免重復造輪子。在Java中,設計模式的應用更是幾乎無處不在,幫助我們優化架構、提升開發效率。

今天我們將重點講解幾個常見的設計模式,具體包括單例模式工廠模式,以及其他一些經典的設計模式,如觀察者模式策略模式適配器模式。在這個過程中,我們不僅要知道“為什么”使用這些模式,更要知道“如何”使用它們。

1. 單例模式:確保全局只有一個實例

單例模式是一個非常常見的設計模式,它的核心思想是:保證一個類只有一個實例,并提供一個全局的訪問點。這個模式特別適用于控制資源的使用,比如數據庫連接池、線程池等。單例模式不僅能避免多個實例造成的資源浪費,還能控制類的實例化過程,確保一致性。

1.1 餓漢式單例

餓漢式單例是在類加載時就創建單例對象,因此它是線程安全的,且實現簡單。但是,這種方式缺點在于,不管是否需要該實例,類加載時就會進行實例化。

public class Singleton {// 在類加載時初始化實例private static final Singleton INSTANCE = new Singleton();// 私有化構造函數private Singleton() {}// 提供公共方法獲取實例public static Singleton getInstance() {return INSTANCE;}
}

這種方式的缺點是:如果你只在某些情況下需要這個單例實例,它依然會在類加載時就創建好,這可能造成性能上的浪費。不過,它在高并發場景下是線程安全的。

1.2 懶漢式單例

懶漢式單例則是在需要的時候才實例化對象,這樣可以避免不必要的資源浪費。然而,懶漢式單例在并發場景下存在問題,可能導致多線程下創建多個實例。

public class Singleton {// 聲明靜態變量,但不初始化private static Singleton instance;// 私有化構造函數private Singleton() {}// 提供公共方法獲取實例public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

上面的代碼在多線程環境下會出現問題,如果多個線程同時進入getInstance()方法,可能會導致多個實例的創建。為了避免這種情況,我們使用sychronized進行同步。但是,性能上并不是最優。

1.3 雙重檢查鎖定(DCL)

雙重檢查鎖定(Double-Checked Locking)是為了優化懶漢式單例的性能問題。它通過兩次檢查instance是否為空,第一次檢查是在同步塊外部,第二次檢查則是在同步塊內部。這種方式既能保證線程安全,又能避免每次都進行同步,提升了性能。

public class Singleton {private static volatile Singleton instance;// 私有化構造函數private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

volatile關鍵字用于保證instance變量在多線程環境下的可見性,確保所有線程都能看到最新的instance值。雙重檢查鎖定提供了較高的性能,是懶漢式單例的優化版本。

2. 工廠模式:簡化對象創建

工廠模式是一種創建對象的設計模式,目的是為了將對象的創建過程與使用過程分離,從而提高代碼的可維護性和擴展性。工廠模式的基本思想是定義一個用于創建對象的接口,由具體的工廠類實現該接口。

2.1 簡單工廠模式

簡單工廠模式又叫靜態工廠方法,它通過一個工廠類來決定哪個類的實例應該被創建。工廠類根據不同的條件(如傳入的參數)來返回不同的對象。

public class AnimalFactory {public static Animal createAnimal(String type) {if ("Dog".equals(type)) {return new Dog();} else if ("Cat".equals(type)) {return new Cat();}return null;}
}

在這個簡單的工廠模式中,AnimalFactory類根據傳入的type來決定返回哪個具體的動物實例。該模式的缺點是,如果新增了一個Animal子類,我們需要修改工廠方法,違背了開閉原則。

2.2 工廠方法模式

工廠方法模式是對簡單工廠模式的進一步抽象。每一個具體的工廠都繼承自一個抽象工廠類,通過不同的工廠來創建對象。這樣一來,當需要新增一個產品時,我們只需要新增一個工廠類,而不需要修改原有代碼,符合開閉原則。

public abstract class AnimalFactory {public abstract Animal createAnimal();
}public class DogFactory extends AnimalFactory {@Overridepublic Animal createAnimal() {return new Dog();}
}public class CatFactory extends AnimalFactory {@Overridepublic Animal createAnimal() {return new Cat();}
}

2.3 抽象工廠模式

抽象工廠模式進一步擴展了工廠方法模式,它不僅能生產一個產品類別的對象,還能生產多個相關的對象。例如,一個“動物工廠”可能不僅僅生產狗、貓,還可以生產它們的相關對象,如“狗的玩具”或“貓的食品”。

public interface AnimalFactory {Animal createAnimal();Toy createToy();
}public class DogFactory implements AnimalFactory {public Animal createAnimal() {return new Dog();}public Toy createToy() {return new DogToy();}
}

通過這種方式,我們不僅可以創建不同類型的動物,還能創建與動物相關的產品。抽象工廠模式使得我們能夠在多個產品族之間進行切換,且能夠擴展更多產品類別而無需修改現有代碼。

3. 其他設計模式

3.1 觀察者模式

觀察者模式是一種行為型設計模式,主要用于對象間的一對多關系,當一個對象的狀態發生改變時,所有依賴它的對象都會得到通知并自動更新。觀察者模式廣泛應用于事件驅動系統,比如GUI系統中的事件監聽,或者消息推送等場景。

public interface Observer {void update(String message);
}public class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received: " + message);}
}public class Subject {private List<Observer> observers = new ArrayList<>();public void addObserver(Observer observer) {observers.add(observer);}public void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}

3.2 策略模式

策略模式是一種行為型設計模式,定義了一系列算法,并將每一個算法封裝起來,使它們可以互相替換。策略模式讓算法的變化獨立于使用算法的客戶。

public interface PaymentStrategy {void pay();
}public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay() {System.out.println("Paying with Credit Card");}
}public class PayPalPayment implements PaymentStrategy {@Overridepublic void pay() {System.out.println("Paying with PayPal");}
}

3.3 適配器模式

適配器模式是一種結構型設計模式,允許我們將一個類的接口轉換成客戶希望的另一個接口,使得原本由于接口不兼容而不能一起工作的類可以一起工作。

public interface MediaPlayer {void play(String fileName);
}public class AudioPlayer implements MediaPlayer {@Overridepublic void play(String fileName) {System.out.println("Playing audio: " + fileName);}
}public interface AdvancedMediaPlayer {void playMP4(String fileName);
}public class MP4Player implements AdvancedMediaPlayer {@Overridepublic void playMP4(String fileName) {System.out.println("Playing MP4: " + fileName);}
}public class MediaAdapter implements MediaPlayer {private AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(AdvancedMediaPlayer advancedMusicPlayer) {this.advancedMusicPlayer = advancedMusicPlayer;}@Overridepublic void play(String fileName) {advancedMusicPlayer.playMP4(fileName);}
}

4. 結語

設計模式的應用,可以幫助我們更好地管理復雜的系統結構,提升代碼的靈活性、可維護性和可擴展性。在實際開發中,根據具體需求合理選用不同的設計模式,能讓我們的代碼更加優雅和高效。希望今天的內容能幫助你對這些經典設計模式有更深入的理解,并在實際開發中游刃有余地運用它們!

… …

文末

好啦,以上就是我這期的全部內容,如果有任何疑問,歡迎下方留言哦,咱們下期見。

… …

學習不分先后,知識不分多少;事無巨細,當以虛心求教;三人行,必有我師焉!!!

wished for you successed !!!


??若喜歡我,就請關注我叭。

??若對您有用,就請點贊叭。
??若有疑問,就請評論留言告訴我叭。


版權聲明:本文由作者原創,轉載請注明出處,謝謝支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95638.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Meta AIUCSD放大招:DeepConf 讓大語言模型推理既快又準,84.7%的token節省+近乎完美的準確率!

1. 【前言】 Meta&UCSD 大語言模型&#xff08;LLMs&#xff09; 在推理任務中通過自一致性等測試時縮放方法展現出巨大潛力&#xff0c;但存在精度收益遞減和計算開銷高的問題。為此&#xff0c;Meta與UCSD的研究人員提出DeepConf方法&#xff0c;它利用模型內部的置信度信…

解決leetcode第3671.子序列美麗值求和問題

3671. 子序列美麗值求和難度&#xff1a;困難問題描述&#xff1a;給你一個長度為 n 的整數數組 nums。對于每個 正整數 g&#xff0c;定義 g 的 美麗值 為 g 與 nums 中符合要求的子序列數量的乘積&#xff0c;子序列需要 嚴格遞增 且最大公約數&#xff08;GCD&#xff09;恰…

電機控制(一)-電機分類

電機分類 電機分類&#xff1a; 電機的拓撲模型并沒有發生太大變化,變化較大的是控制電機的方法。 常見的電機類型有&#xff1a; 步進電機vs伺服電機 在工業自動化、機器人、精密設備等領域&#xff0c;步進電機和伺服電機是兩種最常用的驅動電機&#xff0c;但兩者的核心…

【Qt】QToolBar、QToolButton的常用用法

一、QToolBar 常用用法 QToolBar 是 Qt 中用于創建工具欄的控件&#xff0c;可快速放置常用功能按鈕、分隔符或自定義控件&#xff0c;并支持拖動停靠、浮動等特性。 1. 基礎創建與添加到主窗口 // 在 QMainWindow 中創建工具欄 QToolBar *toolBar new QToolBar(tr("主工…

DVWA靶場通關筆記-驗證碼繞過Insecure CAPTCHA (Impossible級別)

目錄 一、reCAPTCHA 1、配置security為Impossible級別。 2、配置RECAPTCHA參數 3、再次打開靶場 二、源碼分析 1、index.php 2、impossible.php 3、功能函數 三、reCAPTCHA 防范分析 1、嚴格的參數驗證與處理 2、預處理防止SQL注入 3、CAPTCHA 驗證通過 4、驗證當前…

MySQL安裝(如果之前有安裝過MySQL,先執行下面的卸載流程)

1.安裝MySQL 1.1更新系統的軟件包列表 sudo apt-get update1.2安裝MySQL服務器 sudo apt-get install mysql-server1.3檢查MySQL服務是否啟動&#xff0c;若沒有啟動手動啟動若沒有啟動執行&#xff1a; sudo service mysql start1.4登錄MySQL&#xff08;默認安裝之后不需要密…

Streamlit 數據看板模板:非前端選手快速搭建 Python 數據可視化交互看板的實用工具

你想想看&#xff0c;平時你用 Python 跑出來一堆數據 —— 比如用戶留存率、產品銷量變化&#xff0c;想給領導或者同事看&#xff0c;總不能直接發個 CSV 文件或者一堆靜態圖吧&#xff1f;對方看的時候還得自己翻數據&#xff0c;想對比下上個月和這個月的變化都費勁&#x…

FMC、FMC+ 詳解

文章目錄FMC 簡介FMC 引腳輸出定義High-pin count (HPC) connector, HPC pinoutLow-pin count (LPC) connector, LPC pinoutPin and signal descriptionFMC 簡介VITA57 標準更新歷史VITA57.4 標準推出的原因FMC 引腳輸出定義Altera 開發板的 FMC 引腳定義英特爾 Arria 10 GX FP…

小迪web自用筆記24

黑名單機制。如果被過濾可以試試PHP5看看過濾沒&#xff08;或者其他變種變形&#xff09;&#xff0c;但是得看環境有些環境會被當成下載&#xff0c;有些會直接打開。白名單機制只允許這幾個特定后綴可以上傳&#xff0c;比黑名單更安全。直接從信息圖中獲取文件類型。文件類…

私有部署問卷系統、考試系統、投票系統、測評系統的最佳選擇-調問開源問卷表單(DWSurvey)

在選擇私有部署問卷系統的時候&#xff0c;調問問卷系統(DWSurvey)是一定要嘗試一下&#xff0c;而且可以應用到私有部署考試系統、私有部署投票系統、私有部署測評系統等多個應用場景。 私有部署問卷、考試、測評、投票系統的優勢不言而喻&#xff0c;就拿私有部署考試系統來說…

企業實用——MySQL的備份詳解

序言: 本次基于mysql8.0.40來給大家做數據庫的備份的實用技巧和思路!對于mysql基礎的部分后續我會節選部分給大家講解,本篇文章適合有一定數據庫基礎的小伙伴看。 目錄 一、MySQL備份概述 1、關于數據保存你要知道 2、到底要備份什么 備份什么 MySQL體系結構(MySQL =…

使用 FunASR 工具包實現音頻文件的語音識別

使用 FunASR 工具包實現音頻文件的語音識別&#xff0c;并將識別結果保存為文本文件&#xff0c;支持單文件處理和批量處理。電腦環境需要配置&#xff0c;我使用的PyTorch版本: 2.4.1cu121&#xff0c;CUDA可用: True。FunASR 是一個功能強大、性能卓越、面向工業應用的語音識…

【STM32】定時器編碼器接口

【STM32】定時器編碼器接口一、編碼器接口1.1 正交編碼器1.2 編碼器接口基本結構1.3 工作模式二、編碼器接口測速一、編碼器接口 編碼器接口可接收增量&#xff08;正交&#xff09;編碼器的信號&#xff0c;根據編碼器旋轉產生的正交信號脈沖&#xff0c;自動控制CNT的自增或…

浪潮科技Java開發面試題及參考答案(120道題-中)

請介紹一下 SpringMVC 的運行流程&#xff1f;從用戶發送請求到響應返回的完整步驟是什么&#xff1f;SpringMVC 是基于MVC架構的Web框架&#xff0c;其運行流程圍繞“前端控制器&#xff08;DispatcherServlet&#xff09;”展開&#xff0c;通過多個組件協同工作&#xff0c;…

k8s初始化常見問題

執行初始化&#xff1a;kubeadm init --apiserver-advertise-address192.168.88.110 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr10.244.0.0/16 --control-plane-endpointweb01報錯信息&#xff1a;age-repository registry.aliyuncs.com/…

Python學習筆記--使用Django修改和刪除數據

一、修改方式一&#xff1a;模型類的對象.屬性 更改的屬性值&#xff0c;模型類的對象.save()返回值&#xff1a;編輯的模型類的對象。def update_book(request):book models.Book.objects.filter(pk1).first()book.price "169"book.save()return HttpResponse(bo…

如何評價2025年數學建模國賽?

2025年全國大學生數學建模競賽將于9月4日正式舉行&#xff01; 有些第一次參加數學競賽的同學可能覺得自己還沒準備好&#xff0c;臨近比賽感到緊張很正常&#xff0c;但需調整心態——數學建模比賽本就是學習過程&#xff0c;遇到不會的知識及時搜索、現學現用即可&#xff0…

uniapp [全端兼容] - 實現全景圖Vr 720°全景效果查看預覽功能,3D全景圖流暢不卡頓渲染+手勢拖拽+懸浮工具按鈕,uniAPP實現vr看720度全景效果示例代碼(H5小程序APP全兼容)

前言 如果您需要 Vue 版本,請訪問 這篇文章。 在 uni-app 全平臺兼容(H5網頁網站、支付寶/微信小程序、安卓App、蘋果App、nvue)開發中,詳細實現全景圖Vr 720全景查看+用戶可流暢拖動預覽+自定義工具欄/按鈕元素等,uniApp如何實現在線觀看720度全景圖,適用于全景圖VR看房…

51單片機-實現串口模塊教程

本章概述思維導圖&#xff1a;51單片機實現串口模塊教程通信基本概念通信&#xff0c;至少是需要兩個對象&#xff0c;一個收一個發數據。根據數據通信的傳輸時序協調方式&#xff0c;可分為&#xff1a;同步通信和異步通信&#xff1b;根據數據通信的傳輸線路可分為&#xff1…

Linux echo 命令使用說明

echo 命令使用說明&#xff08;Linux&#xff09; 適用環境 Bash/Zsh 等常見 Shell&#xff08;echo 通常為內建命令&#xff09;也可能存在外部 /bin/echo&#xff08;行為與內建略有差異&#xff09; 基本語法 echo [選項] [字符串...]常用選項 -n: 結尾不輸出換行-e: 解析反…