日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java描述设计模式(18):享元模式

發布時間:2025/3/16 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java描述设计模式(18):享元模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文源碼:GitHub·點這里 || GitEE·點這里

一、使用場景

應用代碼

public class C01_InScene {public static void main(String[] args) {String c0 = "cicada" ;String c1 = "cicada" ;System.out.println(c0 == c1); // true} }

String類型就是使用享元模式。String對象是final類型,對象一旦創建就不可改變。在JAVA中字符串常量都是存在常量池中的,JAVA會確保一個字符串常量在常量池中只有一個拷貝,其中c0和c1就是一個字符串常量。結果為:true,說明c0和c1兩個引用都指向了常量池中的同一個字符串常量"cicada"。這樣的設計避免了在創建N多相同對象時所產生的不必要的大量的資源消耗。

二、享元模式

1、基礎簡介

享元模式是對象的結構模式。享元模式以共享的方式高效地支持大量的細粒度對象。常用于系統底層開發,解決系統的性能問題。像數據庫連接池,里面都是創建好的連接對象,在這些連接對象中有需要的則直接拿來用,避免重新創建。

2、模式圖解

3、核心角色

  • 抽象享元角色

給出一個抽象接口,以規定具體享元角色要實現的方法。

  • 具體享元角色

實現抽象享元角色所規定出的接口。如果有內部狀態的話,必須為內部狀態提供存儲能力。

  • 享元工廠角色

負責創建和管理享元角色。必須保證享元對象可以被系統選擇性共享。當一個客戶端對象調用一個享元對象的時候,享元工廠角色會檢查系統中是否已經有一個符合要求的享元對象。如果已經存在,直接返回該對象;如果系統中沒有該享元對象,享元工廠角色就應當創建該享元對象。

4、內部外部狀態

  • 內部狀態指對象共享出來的信息,存儲在享元對象內部且不會隨環境的改變而改變。
  • 外部狀態指對象得以依賴的一個標記,可以隨環境改變而改變的、不可共享的狀態。

5、源碼實現

public class C02_FlyWeight {public static void main(String[] args) {FlyweightFactory factory = new FlyweightFactory();Flyweight fly = factory.factoryMethod('c');fly.printState("One");fly = factory.factoryMethod('d');fly.printState("Two");fly = factory.factoryMethod('c');fly.printState("San");// 調用了三次工廠方法,只創建了兩個對象factory.poolInfo();} } /*** 抽象享元角色類*/ interface Flyweight {void printState (String state); } /*** 具體享元角色類*/ class ConcreteFlyweight implements Flyweight {private Character innerState = null;public ConcreteFlyweight (Character state){this.innerState = state;}@Overridepublic void printState(String state) {System.out.println("內部狀態:" + this.innerState);System.out.println("外部狀態:" + state);} } /*** 享元工廠角色類*/ class FlyweightFactory {// 模擬數據池private Map<Character,Flyweight> pool = new HashMap<>();public Flyweight factoryMethod (Character state){//先從緩存中查找對象Flyweight fly = pool.get(state);if(fly == null){fly = new ConcreteFlyweight(state);pool.put(state, fly);}return fly;}public void poolInfo (){System.out.println("數據池:"+pool);} }

三、JDK應用場景

  • 測試代碼塊
public class C03_Integer {public static void main(String[] args) {Integer c1 = Integer.valueOf(127),c2 = Integer.valueOf(127) ;Integer c3 = new Integer(127),c4 = new Integer(127) ;boolean flag1 = c1==c2 ,flag2 = c2==c3,flag3 = c3==c4 ;// true;false;falseSystem.out.println(flag1+";"+flag2+";"+flag3);Integer c5 = Integer.valueOf(222),c6=Integer.valueOf(222) ;// falseSystem.out.println(c5==c6);} }
  • 源碼分析
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i); }

這里valueOf方法的意思就是,如果傳入的數據在 (-128) 到 (127) 之間,則從緩存中直接返回,否則創建一個新的Integer對象。

四、模式總結

享元模式能夠解決重復對象的內存浪費的問題,當系統中有大量相似對象,需要緩沖池時。不需一直創建新對象,可以從緩沖池里拿。這樣可以降低系統內存,同時提高效率。經典的應用場景就是池技術,String常量池、數據庫連接池、緩沖池等等都是享元模式的應用,享元模式是池技術的重要實現方式。享元模式使得系統更加復雜。為了使對象可以共享,需要時刻管理對象的狀態變化,這使得程序的邏輯變得復雜。

五、源代碼地址

GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent

總結

以上是生活随笔為你收集整理的Java描述设计模式(18):享元模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。