Java設計模式-享元模式

来源:https://www.cnblogs.com/xstxjs/archive/2023/05/24/17429579.html
-Advertisement-
Play Games

## 初步瞭解 ### 總體架構設計 Mybatis 整體框架如下: ![img](https://zhangjiahao-blog.oss-cn-beijing.aliyuncs.com/picgo/202305161021323.png) ##### 介面層 MyBatis 和資料庫的交互有兩種 ...


簡介

在Java領域的軟體開發中,設計模式是提高代碼可維護性和可擴展性的重要工具。其中,享元模式是一種被廣泛使用的設計模式,它通過優化對象的重用來提升系統性能。

享元模式是一種結構型設計模式,旨在通過共用對象來減少系統中的對象數量,從而提升性能和減少記憶體消耗。在享元模式中,對象分為兩類:內部狀態(Intrinsic State)和外部狀態(Extrinsic State)。內部狀態是對象可共用的部分,而外部狀態是對象的變化部分,每個對象都有自己的外部狀態。

與其他設計模式的區別:

  • 享元模式與單例模式:單例模式關註於只有一個實例的創建,而享元模式關註於對象的重用。享元模式允許多個對象存在,但通過共用內部狀態來減少重覆對象的創建。
  • 享元模式與原型模式:原型模式通過複製現有對象來創建新的對象,而享元模式通過共用現有對象來避免創建新對象。享元模式在多個對象之間共用相同的狀態,而原型模式則不共用。

實現

下麵是使用Java編程語言實現外觀模式的示例代碼:

// 定義享元介面
public interface Shape {
    void draw();
}

// 具體享元類
public class Circle implements Shape {
    private String color;
    
    public Circle(String color) {
        this.color = color;
    }
    
    public void draw() {
        System.out.println("Drawing a circle with color: " + color);
    }
}

// 享元工廠類
public class ShapeFactory {
    private static final Map<String, Shape> circleMap = new HashMap<>();
    
    public static Shape getCircle(String color) {
        Circle circle = (Circle) circleMap.get(color);
        
        if (circle == null) {
            circle = new Circle(color);
            circleMap.put(color, circle);
            System.out.println("Creating a new circle with color: " + color);
        }
        
        return circle;
    }
}

// 客戶端代碼
public class Client {
    private static final String[] colors = { "Red", "Green", "Blue" };
    
    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
            circle.draw();
        }
    }
    
    private static String getRandomColor() {
        return colors[(int)(Math.random() * colors.length)];
    }
}


優缺點

優點

  • 減少對象的數量:享元模式通過共用內部狀態來減少系統中的對象數量,從而減少記憶體消耗。
  • 提升性能:由於重覆對象的創建被避免,享元模式可以顯著提升系統的性能。
  • 簡化對象結構:通過將對象的狀態劃分為內部狀態和外部狀態,享元模式可以簡化對象的結構,使得系統更易於理解和維護。

缺點

  • 需要維護共用池:享元模式需要維護一個共用對象的池,這可能會增加代碼的複雜性和維護成本。
  • 對象狀態共用可能引發線程安全問題:如果多個線程同時訪問共用對象並修改其外部狀態,需要確保線程安全性。

運用場景

享元模式適用於以下場景:

  1. 當系統中存在大量相似對象且消耗大量記憶體時,可以考慮使用享元模式來減少記憶體消耗。
  2. 當需要頻繁創建和銷毀對象時,可以使用享元模式提升系統性能。
  3. 當對象的內部狀態與外部狀態分離,並且外部狀態相對較少時,可以考慮使用享元模式。

總結

享元模式是Java設計模式中一種被廣泛應用的優化性能的設計模式。通過共用內部狀態來減少對象的數量,從而降低記憶體消耗和提升系統性能。與單例模式和原型模式相比,享元模式註重對象的重用而不是單例或複製。使用Java編程語言實現享元模式可以通過共用池來管理對象的共用和創建。

該模式的優點在於減少對象數量、提升性能和簡化對象結構。通過共用對象,系統記憶體占用減少,同時避免了重覆創建對象的開銷,從而提高了系統的性能。通過劃分內部狀態和外部狀態,對象結構更清晰,更易於理解和維護。

然而,享元模式也存在一些缺點和限制。維護共用池可能增加代碼的複雜性和維護成本。並且,共用對象的狀態共用可能引發線程安全問題,需要註意併發訪問和修改共用對象的外部狀態。

適用場景包括系統中存在大量相似對象且消耗大量記憶體的情況,通過共用對象可以減少記憶體消耗。在需要頻繁創建和銷毀對象的情況下,享元模式可以提升系統性能。當對象的內部狀態與外部狀態分離,且外部狀態相對較少時,也可以考慮使用該模式。

通過合理應用享元模式,開發人員可以優化系統設計,提高代碼的可維護性和可擴展性。通過共用對象,我們可以更有效地管理系統資源,提升系統的性能和響應能力。因此,享元模式在Java開發中具有重要的應用和意義。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. CSS3 新增選擇器 CSS3 給我們新增了選擇器,可以更加便捷,更加自由的選擇目標元素。 1.1 屬性選擇器 屬性選擇品可以根據元素特定屬性的來選擇元素。這樣就可以不用藉助於類或者id選擇器。 選擇符 簡介 E[att] 選擇具有 att 屬性的E 元素。 E[att="val"] 選擇具有 ...
  • > 隨著人工智慧技術的不斷發展,阿裡體育等IT大廠,推出的“樂動力”、“天天跳繩”AI運動APP,讓**雲上運動會、線上運動會、健身打卡、AI體育指導**等概念空前火熱。那麼,能否將這些在APP成功應用的場景搬上小程式,分享這些概念的紅利呢?本系列文章就帶您一步一步從零開始開發一個AI運動小程式,本 ...
  • 一開始看到這個功能需求,我也很懵逼,因為從來沒有做過啊,哈哈。。。但轉念一想既然產品能提出這個需求,想必會有人實現過,就去網上查了查資料,果不其然,還真有人做過,但離我想要的效果還是差著十萬八千里,所以按照網上大神的思路,結合我司的實際需求,自己就把它給搗鼓出來了。 其實剛做好的效果還是能實現產品... ...
  • 在前端開發過程中,我們在設置預設值的時候,會經常用到 || 和 ?? , 但是這兩者有什麼區別呢?分別在什麼場景下麵使用呢,會有哪些坑呢,今天我們來梳理下呢。 ## || 的語法作用 console.log(null || 1) //輸出 1 console.log(undefined || 1) ...
  • 在 HTML 中,屬性(Attribute)和屬性(Property)是用於描述 HTML 元素的相關特性的術語。 屬性(Attribute)是指在 HTML 標簽中聲明的附加信息。它們以鍵值對的形式出現,用於提供元素的初始狀態或配置選項。屬性的名稱是不區分大小寫的,並且值可以是字元串或布爾值。 例 ...
  • ### GC 優化 #### 1.防止大對象Buffer到記憶體中 **現象**:當大包請求時,YGC 耗時嚴重 **原因**:預設情況下 Zuul2 並不會緩存請求體(DirectByteBuffer),也就意味著它會先發送接收到的請求 Headers 到後端服務,之後接收到請求體再繼續發送到後端服 ...
  • 一、什麼是微服務 微服務是一種技術架構,通常我們可以把它理解為一組可以相互之間協同工作的應用程式或服務,這些應用程式或服務能夠被單獨部署到不同的伺服器中,並且能夠自主運行和維護。 微服務技術只是一個名稱而已,或許我們在日常工作中已經或多或少在使用其中的一種或幾種技術和架構,但我們並沒有將其稱之為微服 ...
  • 汽車之家電商系統誕生在2014年,成長於2016~2019年,並經歷多年雙11、818晚會的洪峰考驗,沉澱了穩定可靠、性能卓越的線上交易能力。隨著業務中台的建設浪潮興起,2019年進入中台化建設階段,輸出其在汽車電商領域五年沉澱的能力,助力汽車電商行業發展,加速企業數字化轉型! ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...