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

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

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

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 情侣奴伺候女王第2部分小说 | 国产一区二区免费视频 | 99视频全部看免费观 | 成年人免费看的视频 | 色老板在线免费视频 | 深夜在线网址 | 国产1区精品 | 日韩 国产 欧美 | 精品久久久久久久高清 | 国产91 最新 在线 | 国产高清露脸学生在线观看 | 午夜福利体验免费体验区 | 青草草在线观看 | 星空传媒在线视频 | 亚洲 欧美 偷自乱 图片 | 欧美白人猛性xxxxx69交 | 国产无限免费观看黄网站 | 午夜影院h | gay台湾无套男同志可播放 | 热99精品视频 | 国产精品国产三级在线专区 | 免费a漫 - 禁密天堂 | 91porn在线观看国产 | 国产一区在线免费观看 | 欧美特一级 | 日日操美女 | 污网站免费观看在线高清 | 99精品免费在线观看 | 思思久久精品在热线热 | 亚洲 欧美 国产 在线 日韩 | 成人免费一区二区三区在线观看 | 性伴交换多p | 午夜十八岁禁 | 国产高清国内精品福利 | 成人网视频免费播放 | 亚洲国产成人久久精品hezyo | 狠狠的撞进去嗯啊h女强男视频 | 成人国产精品视频频 | 国产成人亚洲综合91精品555 | 好紧好爽再叫浪一点点潘金莲 | 特黄特色一级aa毛片免费观看 |