欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java設(shè)計(jì)模式編程中的Flyweight享元模式的開(kāi)發(fā)結(jié)構(gòu)

 更新時(shí)間:2016年04月27日 12:04:40   作者:zzq19860626  
這篇文章主要介紹了Java設(shè)計(jì)模式編程中的Flyweight享元模式的開(kāi)發(fā)結(jié)構(gòu),享元模式能夠最大限度地重用現(xiàn)有的同類對(duì)象,需要的朋友可以參考下

享元(Flyweight)模式:通過(guò)共享技術(shù)以便有效的支持大量細(xì)粒度的對(duì)象。
享元模式在閻宏的《java與模式》中分為單純享元模式和復(fù)合享元模式,復(fù)合模式的復(fù)合享元是不可以共享的,享元對(duì)象能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊(yùn)態(tài)(Internal State)和外蘊(yùn)態(tài)( External State)。這兩個(gè)“蘊(yùn)態(tài)”翻譯的太難懂,我不是說(shuō)翻譯的不好,可能是我理解能力差,還是《Design Pattern Elements of Reusable Object-Oriented Software》的翻譯版《設(shè)計(jì)模式可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書(shū)總翻譯為內(nèi)部對(duì)象和外部對(duì)象,相對(duì)直白,對(duì)概念性的東西文學(xué)氣味太強(qiáng)了就覺(jué)得很別扭。這里的角色也采用《設(shè)計(jì)模式可復(fù)用面向?qū)ο筌浖幕A(chǔ)》的說(shuō)法,不區(qū)分單純模式和復(fù)合模式,而是有一個(gè)UnSharedConcreteFlyweight(在《java與模式》里稱復(fù)合享元,指明復(fù)合享元不能共享),我們這里稱它不可以共享享元角色,這樣享元模式的角色有:

  • 抽象享元(Flyweight)角色:是給實(shí)現(xiàn)享元提供的接口。
  • 具體享元(ConcreteFlyweight)角色:實(shí)現(xiàn)抽象角色,此對(duì)象必須是共享的,所含的狀態(tài)必須是內(nèi)部狀態(tài)。
  • 不共享享元(UnSharedConcreteFlyweight)角色:此對(duì)象不可共享,不是所有實(shí)現(xiàn)抽象享元接口的的對(duì)象都要共享,此對(duì)象通常將ConcreteFlyweight作為組成元素。
  • 享元工廠(FlyweightFactory)角色:負(fù)責(zé)創(chuàng)建和管理享元角色,確保合理共享。
  • 客戶端(Client)角色:維持一個(gè)Flyweight對(duì)象的引用,計(jì)算或存儲(chǔ)一個(gè)(多個(gè))外部存儲(chǔ)狀態(tài)。

享元模式的類的機(jī)構(gòu)圖如下:

2016427120136286.png (580×276)

享元模式在java.lang.String設(shè)計(jì)上的使用,我們知道java中字符串始終保持共享一份,如下面代碼片段:

String m = "a";
String n = "a";
System.out.println(m==n);

這樣會(huì)輸出true,說(shuō)明m和n指向了同一個(gè)實(shí)例,內(nèi)存中也只有一個(gè)"a"。這就是享元模式在String上的使用。
 
享元模式在文字編輯存貯過(guò)程中的使用,這里假定文章由行對(duì)象組成,行對(duì)象由若干個(gè)字符對(duì)象組成,但是如果每個(gè)字符都保存自己的對(duì)象,那么一篇文章成千上萬(wàn)個(gè)字符對(duì)象,這樣嚴(yán)重消耗系統(tǒng)內(nèi)存,造成不可接受的運(yùn)行時(shí)開(kāi)銷,好的方法是利用享元模式,只保存ASCII字符編碼值,作為內(nèi)部不變的狀態(tài),對(duì)當(dāng)個(gè)字符對(duì)象進(jìn)行共享,而相對(duì)字符顏色、大小這樣的格式化數(shù)據(jù)作為外部狀態(tài),由客戶端維護(hù),運(yùn)行時(shí)由外部傳入即可。每個(gè)行作為不可共享享元對(duì)象,它是由享元對(duì)象(字符對(duì)象)組合而成的。

2016427120204633.png (600×263)

我們來(lái)看個(gè)簡(jiǎn)單地享元模式的結(jié)構(gòu)的例子:

/** 
 * 字母 
 */ 
public class Letter { 
 
 private String name; 
 
 public Letter(String name) { 
  this.name = name; 
 } 
 
 public String getName() { 
  return name; 
 } 
} 
/** 
 * 一個(gè)產(chǎn)生字母對(duì)象的 享元工廠(單例工廠) 
 */ 
public class LetterFactory { 
 private Map<String, Letter> map; 
 private static LetterFactory instance = new LetterFactory(); 
  
 private LetterFactory() { 
  map = new HashMap<String, Letter>(); 
 } 
  
 public static LetterFactory getInstance() { 
  return instance; 
 } 
  
 public void add(Letter letter) { 
  if (letter != null && !map.containsKey(letter.getName())) { 
   map.put(letter.getName(), letter); 
  } 
  System.out.println("map.size====" + map.size()); 
 } 
  
 public Letter get(String name) { 
  return map.get(name); 
 } 
  
} 

public class Test { 
 public static void main(String[] args) { 
  LetterFactory factory = LetterFactory.getInstance(); 
  String word = "easiness"; 
  addLetterByName(factory, word); 
   
  getLetter(factory, word); 
 } 
 //添加字母對(duì)象 
 static void addLetterByName(LetterFactory factory, String word) { 
  for (char c : word.toCharArray()) { 
   factory.add(new Letter(c + "")); 
  } 
 } 
 //輸出字母對(duì)象 
 static void getLetter(LetterFactory factory, String word) { 
  for (char c : word.toCharArray()) { 
   System.out.println(factory.get(c + "")); 
  } 
 } 
} 


打?。?/p>

map.size====1 
map.size====2 
map.size====2 
map.size====3 
map.size====4 
map.size====5 
map.size====5 
flyweight.Letter@3343c8b3 
flyweight.Letter@272d7a10 
flyweight.Letter@3343c8b3 
flyweight.Letter@1aa8c488 
flyweight.Letter@3dfeca64 
flyweight.Letter@22998b08 
flyweight.Letter@1aa8c488 

相關(guān)文章

  • 教你使用springSecurity+jwt實(shí)現(xiàn)互踢功能

    教你使用springSecurity+jwt實(shí)現(xiàn)互踢功能

    JWT作為一個(gè)開(kāi)放的標(biāo)準(zhǔn)( RFC 7519 ),定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以Json對(duì)象的形式安全的傳遞信息。接下來(lái)通過(guò)本文給大家介紹springSecurity+jwt實(shí)現(xiàn)互踢功能,需要的朋友可以參考下
    2021-11-11
  • Spring定時(shí)任務(wù)注解@Scheduled詳解

    Spring定時(shí)任務(wù)注解@Scheduled詳解

    這篇文章主要介紹了Spring定時(shí)任務(wù)注解@Scheduled詳解,@Scheduled注解是包org.springframework.scheduling.annotation中的一個(gè)注解,主要是用來(lái)開(kāi)啟定時(shí)任務(wù),本文提供了部分實(shí)現(xiàn)代碼與思路,需要的朋友可以參考下
    2023-09-09
  • java利用JEXL實(shí)現(xiàn)動(dòng)態(tài)表達(dá)式編譯

    java利用JEXL實(shí)現(xiàn)動(dòng)態(tài)表達(dá)式編譯

    這篇文章主要介紹了java利用JEXL實(shí)現(xiàn)動(dòng)態(tài)表達(dá)式編譯,系統(tǒng)要獲取多個(gè)數(shù)據(jù)源的數(shù)據(jù),并進(jìn)行處理,最后輸出多個(gè)字段。字段的計(jì)算規(guī)則一般是簡(jiǎn)單的取值最多加一點(diǎn)條件判斷,下面是具體的實(shí)現(xiàn)方法
    2021-04-04
  • javaweb實(shí)現(xiàn)文件上傳與下載功能

    javaweb實(shí)現(xiàn)文件上傳與下載功能

    這篇文章主要為大家詳細(xì)介紹了javaweb實(shí)現(xiàn)文件上傳與下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Java多線程基本概念以及避坑指南

    Java多線程基本概念以及避坑指南

    多線程之于進(jìn)程的理解,可以類比多進(jìn)程之于操作系統(tǒng),多線程指在單個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線程執(zhí)行不同的任務(wù),這篇文章主要給大家介紹了關(guān)于Java多線程基本概念以及避坑指南的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 帶你用Java方法輕松實(shí)現(xiàn)樹(shù)的同構(gòu)

    帶你用Java方法輕松實(shí)現(xiàn)樹(shù)的同構(gòu)

    給定兩棵樹(shù)T1和T2。如果T1可以通過(guò)若干次左右孩子互換就變成T2,則我們稱兩棵樹(shù)是“同構(gòu)”的。例如圖1給出的兩棵樹(shù)就是同構(gòu)的,因?yàn)槲覀儼哑渲幸豢脴?shù)的結(jié)點(diǎn)A、B、G的左右孩子互換后,就得到另外一棵樹(shù)
    2021-06-06
  • 詳解Java中的do...while循環(huán)語(yǔ)句的使用方法

    詳解Java中的do...while循環(huán)語(yǔ)句的使用方法

    這篇文章主要介紹了Java中的do...while循環(huán)語(yǔ)句的使用方法,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • SpringBoot+MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離的代碼示例

    SpringBoot+MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離的代碼示例

    在當(dāng)今互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)庫(kù)讀寫(xiě)分離是提高系統(tǒng)性能和穩(wěn)定性的重要手段之一,通過(guò)將讀操作和寫(xiě)操作分別路由到不同的數(shù)據(jù)庫(kù)節(jié)點(diǎn),可以有效減輕數(shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān),本文將介紹如何利用SpringBoot和MyBatis-Plus框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離,需要的朋友可以參考下
    2023-11-11
  • 用java實(shí)現(xiàn)掃雷游戲

    用java實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了用java實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 手把手教學(xué)Win10同時(shí)安裝兩個(gè)版本的JDK并隨時(shí)切換(JDK8和JDK11)

    手把手教學(xué)Win10同時(shí)安裝兩個(gè)版本的JDK并隨時(shí)切換(JDK8和JDK11)

    最近在學(xué)習(xí)JDK11的一些新特性,但是日常使用基本上都是基于JDK8,因此,需要在win環(huán)境下安裝多個(gè)版本的JDK,下面這篇文章主要給大家介紹了手把手教學(xué)Win10同時(shí)安裝兩個(gè)版本的JDK(JDK8和JDK11)并隨時(shí)切換的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評(píng)論