一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 詳解Java設計模式編程中的Flyweight享元模式的開發結構

詳解Java設計模式編程中的Flyweight享元模式的開發結構

2020-04-20 14:34zzq19860626 JAVA教程

這篇文章主要介紹了Java設計模式編程中的Flyweight享元模式的開發結構,享元模式能夠最大限度地重用現有的同類對象,需要的朋友可以參考下

享元(Flyweight)模式:通過共享技術以便有效的支持大量細粒度的對象。
享元模式在閻宏的《java與模式》中分為單純享元模式和復合享元模式,復合模式的復合享元是不可以共享的,享元對象能做到共享的關鍵是區分內蘊態(Internal State)和外蘊態( External State)。這兩個“蘊態”翻譯的太難懂,我不是說翻譯的不好,可能是我理解能力差,還是《Design Pattern Elements of Reusable Object-Oriented Software》的翻譯版《設計模式可復用面向對象軟件的基礎》一書總翻譯為內部對象和外部對象,相對直白,對概念性的東西文學氣味太強了就覺得很別扭。這里的角色也采用《設計模式可復用面向對象軟件的基礎》的說法,不區分單純模式和復合模式,而是有一個UnSharedConcreteFlyweight(在《java與模式》里稱復合享元,指明復合享元不能共享),我們這里稱它不可以共享享元角色,這樣享元模式的角色有:

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

享元模式的類的機構圖如下:

詳解Java設計模式編程中的Flyweight享元模式的開發結構

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

?
1
2
3
String m = "a";
String n = "a";
System.out.println(m==n);

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

詳解Java設計模式編程中的Flyweight享元模式的開發結構

 

我們來看個簡單地享元模式的結構的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 字母
 */
public class Letter {
 
 private String name;
 
 public Letter(String name) {
  this.name = name;
 }
 
 public String getName() {
  return name;
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
 * 一個產生字母對象的 享元工廠(單例工廠)
 */
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);
 }
  
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Test {
 public static void main(String[] args) {
  LetterFactory factory = LetterFactory.getInstance();
  String word = "easiness";
  addLetterByName(factory, word);
   
  getLetter(factory, word);
 }
 //添加字母對象
 static void addLetterByName(LetterFactory factory, String word) {
  for (char c : word.toCharArray()) {
   factory.add(new Letter(c + ""));
  }
 }
 //輸出字母對象
 static void getLetter(LetterFactory factory, String word) {
  for (char c : word.toCharArray()) {
   System.out.println(factory.get(c + ""));
  }
 }
}

 

打印:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜久久久久久网站 | 亚洲国产在线播放在线 | 日韩精品一区二三区中文 | 1024免费观看完整版在线播放 | 国产亚洲精品九九久在线观看 | 日本高清va不卡视频在线观看 | 天堂a免费视频在线观看 | 国产黑丝一区 | 天天做天天爽天天谢 | 歪歪私人影院成人毛片 | 精品综合一区二区三区 | ai换脸杨颖啪啪免费网站 | 亚洲精品91香蕉综合区 | 91精品免费观看老司机 | 短篇最污的乱淫伦小说全集 | 日韩性公交车上xxhd免费 | 59日本人xxxxxxxxx69| 亚洲欧美日韩国产精品一区 | 好男人资源在线观看免费的 | 激情五月姐姐 | 亚洲一级特黄 | 午夜AV国产欧美亚洲高清在线 | 美女被的视频 | 国产精品天天看特色大片不卡 | 亚洲AV福利天堂一区二区三 | 日本大片免aaa费观看视频 | 国产99re在线观看69热 | 久久www免费人成_看片高清 | 国产精品美女久久久久 | 亚洲品质自拍视频网站 | 国内自拍网红在综合图区 | 国产成人亚洲影视在线 | jzjzjz日本在线观看 | 免费在线视频网站 | 91探花在线观看 | 美女伊人网 | 成人在线第一页 | 欧美vpswindows | 日韩一区在线观看 | 日本aaaa级| 午夜影院免费看 |