AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

一文徹底搞明白享元模式

來源: 責編: 時間:2024-05-17 17:47:09 162觀看
導讀本篇講解Java設計模式中的享元模式,分為定義、模式應用前案例、結構、模式應用后案例、適用場景、模式可能存在的困惑和本質探討7個部分。定義享元模式指的是運用共享技術有效地支持大量細粒度的對象。在新的分類方式

本篇講解Java設計模式中的享元模式,分為定義、模式應用前案例、結構、模式應用后案例、適用場景、模式可能存在的困惑和本質探討7個部分。hfV28資訊網——每日最新資訊28at.com

定義

享元模式指的是運用共享技術有效地支持大量細粒度的對象。hfV28資訊網——每日最新資訊28at.com

在新的分類方式中,享元模式被劃分至類的屬性相關類別中,其應對類的不同對象可以共享內部狀態(可共享的屬性)的要求。hfV28資訊網——每日最新資訊28at.com

hfV28資訊網——每日最新資訊28at.com

模式應用前案例

在享元模式中,我們來看一個文本編輯器的案例。對于文本編輯器來說,可以包括添加文本、顯示文本、清空文本等操作。對于其中的文本,都有自身的文本樣式。hfV28資訊網——每日最新資訊28at.com

下面,先來看一下未使用享元模式的案例,代碼實現如下。hfV28資訊網——每日最新資訊28at.com

public class Text {//文本類private final String content;private final TextStyle style;public Text(String content, TextStyle style) {this.content = content;this.style = style;    }public void display() {        System.out.println("Text: " + this.content + ", Style: " + this.style);    }}public class TextStyle {//文本樣式類private final String font;private final int size;private final String color;public TextStyle(String font, int size, String color) {this.font = font;this.size = size;this.color = color;    }@Overridepublic String toString() {return "Font: "+ this.font +", Size: "+ this.size +", Color: "+ this.color;    }}public class TextEditor {// 文本編輯器類    List<Text> textList;public TextEditor(){this.textList =new ArrayList<>();    }// 添加文本到編輯器中public void addText(Text text){this.textList.add(text);    }// 顯示所有文本內容和樣式信息public void displayAllTexts(){for(Text text : this.textList){            text.display();        }    }// 清空所有文本內容public void clearAllTexts(){this.textList.clear();        System.out.println("All texts cleared.");    }}

調用方代碼如下。hfV28資訊網——每日最新資訊28at.com

public class Client {//調用方代碼public static void main(String[] args) {// 創建文本編輯器對象        TextEditor textEditor = new TextEditor();// 創建兩個相同樣式(Arial 12 Black)的文字片段并添加到編輯器中        TextStyle textStyle1 = new TextStyle("Arial", 12, "Black");        Text text1 = new Text("Hello World", textStyle1);        TextStyle textStyle2 = new TextStyle("Arial", 12, "Black");        Text text2 = new Text("Welcome to the world of programming!", textStyle2);        textEditor.addText(text1);        textEditor.addText(text2);// 顯示所有文本內容和樣式信息        System.out.println("Displaying all texts:");        textEditor.displayAllTexts();// 清空所有文本內容        System.out.println("/nClearing all texts:");        textEditor.clearAllTexts();    }}

在上述代碼中,文本樣式類是文本類中的屬性。對于每一個文本,即便文本樣式相同,代碼中也會創建新的文本樣式類。hfV28資訊網——每日最新資訊28at.com

直觀感覺上,就會覺得此處是否可以復用呢?對于此種場景,就適合使用享元模式來進行處理。hfV28資訊網——每日最新資訊28at.com

結構

hfV28資訊網——每日最新資訊28at.com

享元模式的示例代碼實現如下。hfV28資訊網——每日最新資訊28at.com

public interface Flyweight {void Operation(int extrinsicstate);}public class ConereteFlyweight implements Flyweight {@Overridepublic void Operation(int extrinsicstate) {        System.out.println("共享的具體Flyweight:" +extrinsicstate);    }}public class UnsharedConereteFlyweight implements Flyweight{@Overridepublic void Operation(int extrinsicstate) {        System.out.println("不共享的具體Flyweight:" +extrinsicstate);    }}public class FlyweightFactory {private static final Map<String, Flyweight> flyweights = new HashMap<>();public FlyweightFactory() {        flyweights.put("A", new ConereteFlyweight());        flyweights.put("B", new ConereteFlyweight());        flyweights.put("C", new ConereteFlyweight());    }public Flyweight getFlyweight(String key) {return flyweights.get(key);    }}public class Client {public static void main(String[] args) {int extrinsicstate = 1;       FlyweightFactory factory = new FlyweightFactory();       Flyweight fa = factory.getFlyweight("A");       fa.Operation(extrinsicstate);       Flyweight fb = factory.getFlyweight("B");       fb.Operation(extrinsicstate);       Flyweight fc = factory.getFlyweight("C");       fc.Operation(extrinsicstate);       UnsharedConereteFlyweight uf = new UnsharedConereteFlyweight();       uf.Operation(extrinsicstate);    }}

可以發現,在享元模式下,先將類的屬性分成兩種類別,一類是多個對象可以共享的狀態,另一類是多個對象私有的狀態。hfV28資訊網——每日最新資訊28at.com

然后,通過接口或繼承實現的一個類家族實現上述兩種類別,即圖中的Flyweight及具體實現類。hfV28資訊網——每日最新資訊28at.com

此外,提供一個FlyweightFactory支撐類,這個類的作用就是負責創建一些包含共享狀態的對象,然后緩存起來。hfV28資訊網——每日最新資訊28at.com

當調用方需要用到時,就可以通過FlyweightFactory來獲取到共享的狀態。同時,那些不能共享的狀態(或屬性),也可以通過UnsharedConcreteFlyweight類來創建。hfV28資訊網——每日最新資訊28at.com

模式應用后案例

上述文本編輯器的案例,在使用享元模式后的代碼實現如下。hfV28資訊網——每日最新資訊28at.com

public class Text {//文本類private final String content;private final TextStyle style;public Text(String content, TextStyle style) {this.content = content;this.style = style;    }public void display() {        System.out.println("Text: " + this.content + ", Style: " + this.style);    }}public class TextStyle {//文本樣式類private final String font;private final int size;private final String color;public TextStyle(String font, int size, String color) {this.font = font;this.size = size;this.color = color;    }@Overridepublic String toString() {return "Font: "+ this.font +", Size: "+ this.size +", Color: "+ this.color;    }}

文本Text類中的TextStyle屬性可以共享,content屬性不能共享。因此,可以創建一個TextFactory類來共享TextStyle。hfV28資訊網——每日最新資訊28at.com

public class TextFactory {//享元工廠類private static final HashMap<String, TextStyle> stylesMap = new HashMap<>();public static TextStyle getTextStyle(String font,int size,String color){        stylesMap.putIfAbsent(font+size+color,new TextStyle(font,size,color));return stylesMap.get(font+size+color);    }}

享元工廠類有了之后,文本編輯器類代碼如下。hfV28資訊網——每日最新資訊28at.com

public class TextEditor {//文本編輯器類    List<Text> textList;public TextEditor(){this.textList =new ArrayList<>();    }// 添加文本到編輯器中public void addText(String content, String font, int size, String color){        TextStyle sharedStyle = TextFactory.getTextStyle(font, size, color);this.textList.add(new Text(content, sharedStyle));    }// 顯示所有文本內容和樣式信息public void displayAllTexts(){for(Text text : this.textList){            text.display();        }    }// 清空所有文本內容public void clearAllTexts(){this.textList.clear();        System.out.println("All texts cleared.");    }}

調用方代碼如下。hfV28資訊網——每日最新資訊28at.com

public class Client {//調用方代碼public static void main(String[] args) {// 創建文本編輯器對象        TextEditor editor = new TextEditor();// 使用編輯器添加相同樣式(Arial 12 Black)的文字片段        editor.addText("Hello World", "Arial", 12, "Black");        editor.addText("Welcome to the world of programming!", "Arial", 12,"Black");// 顯示所有文本內容和樣式信息        System.out.println("Displaying all texts:");        editor.displayAllTexts();    }}

上述代碼中,在需要用到TextStyle的地方,通過享元工廠類獲取,而不是直接通過new方式創建,這樣所有文本類都可以共享一個TextStyle對象,這就是享元模式發揮作用的地方。hfV28資訊網——每日最新資訊28at.com

適用場景

當程序中需要創建大量對象,并且這些對象共享一部分內部狀態,為了節省內存空間,就可以考慮使用享元模式。hfV28資訊網——每日最新資訊28at.com

比如,在Java語言中,Integer、String等類,由于不同對象可能共享相同的字面量,因此其內部都應用了享元模式。hfV28資訊網——每日最新資訊28at.com

模式可能存在的困惑

困惑1:享元模式中,經常提到的內部狀態與外部狀態,是什么含義?hfV28資訊網——每日最新資訊28at.com

一個類中可以包含多個屬性,其中可以被多個對象共享的狀態或屬性成為“內部狀態”,而每個對象獨有的屬性或狀態則成為“外部狀態”。hfV28資訊網——每日最新資訊28at.com

困惑2:結構圖中的Client與FlyweightFactory類有交互,但是案例中的TextEditor類中有使用TextFactory類,Client類并沒有使用?hfV28資訊網——每日最新資訊28at.com

在應用設計模式時,有時候不能按照設計模式標準結構來生搬硬套。關鍵在于理解設計模式的核心思想之后能夠靈活運用。hfV28資訊網——每日最新資訊28at.com

案例中的TextEditor其實相當于結構中的Client。Text類相當于Flyweight類,而TextStyle類Text類中的共享狀態。案例的結構與結構中的結構并不完全相同,但是對于享元模式中的共享思想運用是一致的。hfV28資訊網——每日最新資訊28at.com

困惑3:享元模式相當于是為了對象的復用,以節省存儲空間。在日常編程中,像對象池、線程池、連接池等技術也是為了對象的復用,那么區別在哪里呢?hfV28資訊網——每日最新資訊28at.com

主要區別在于時間觀上的不同。對于對象池、線程池、連接池等技術來說,在同一時刻,一個共享的對象只能用于一個調用方。只有該對象使用完畢重新放在池子之后,其他調用方才能使用。hfV28資訊網——每日最新資訊28at.com

而對于享元模式來說,同一時刻,可以被許多調用方同時共享復用,不需要在時間上錯開使用。hfV28資訊網——每日最新資訊28at.com

本質

享元模式的本質是對類中屬性更細粒度的控制。在享元模式中,是通過狀態是否共享來分類的。hfV28資訊網——每日最新資訊28at.com

通過分類,就可以采取不同的操作。在享元模式中,通過狀態是否共享這種分類方式,就可以用來節省存儲空間,并且節省空間的同時其實也可以節省對象創建的時間。hfV28資訊網——每日最新資訊28at.com

這里值得提醒一下,時間和空間并不是在任何場景下都是一組矛盾關系,如空間增加可以減少時間,空間變少時間就會加長等。在享元模式中,是對象復雜度的降低導致了空間和時間都在某種程度上都有所減少。hfV28資訊網——每日最新資訊28at.com

當然,對于類中屬性也可能有其他分類方式,如本質屬性和偶然屬性的劃分等。享元模式僅僅是處理這些分類方式中的一種特例。hfV28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-88926-0.html一文徹底搞明白享元模式

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Spring Boot 內嵌 Web 容器啟動原理,驚爆你的眼球!

下一篇: 一篇文章徹底理解 Java 的 Suppressed exceptions 機制

標簽:
  • 熱門焦點
  • K60至尊版狂暴引擎2.0加持:超177萬跑分斬獲性能第一

    Redmi的后性能時代戰略發布會今天下午如期舉辦,在本次發布會上,Redmi公布了多項關于和聯發科的深度合作,以及新機K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始?!肮家粋€好消息2023年#小米電視上半年出貨量中國
  • 0糖0卡0脂 旭日森林仙草烏龍茶優惠:15瓶到手29元

    旭日森林無糖仙草烏龍茶510ml*15瓶平時要賣為79.9元,今日下單領取50元優惠券,到手價為29.9元。產品規格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法。可以用來發現應用程序、操作系統和網絡協議等中的漏洞或
  • 2納米決戰2025

    集微網報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
  • iQOO Neo8系列新品發布會

    旗艦雙芯 更強更Pro
  • Counterpoint :OPPO雙旗艦戰略全面落地 高端產品銷量增長22%

    2023年6月30日,全球行業分析機構Counterpoint Research發布的《中國智能手機高端市場白皮書》顯示,中國智能手機品牌正在尋求高質量發展,中國高端智能
Top