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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...