程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Java設計形式編程中的Flyweight享元形式的開辟構造

詳解Java設計形式編程中的Flyweight享元形式的開辟構造

編輯:關於JAVA

詳解Java設計形式編程中的Flyweight享元形式的開辟構造。本站提示廣大學習愛好者:(詳解Java設計形式編程中的Flyweight享元形式的開辟構造)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解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.lang.String設計上的應用,我們曉得java中字符串一直堅持同享一份,以下面代碼片斷:

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

如許會輸入true,解釋m和n指向了統一個實例,內存中也只要一個"a"。這就是享元形式在String上的應用。
 
享元形式在文字編纂存貯進程中的應用,這裡假定文章由行對象構成,行對象由若干個字符對象構成,然則假如每一個字符都保留本身的對象,那末一篇文章不計其數個字符對象,如許嚴重消費體系內存,形成弗成接收的運轉時開支,好的辦法是應用享元形式,只保留ASCII字符編碼值,作為外部不變的狀況,對當個字符對象停止同享,而絕對字符色彩、年夜小如許的格局化數據作為內部狀況,由客戶端保護,運轉時由內部傳入便可。每一個行作為弗成同享享元對象,它是由享元對象(字符對象)組合而成的。

我們來看個簡略地享元形式的構造的例子:

/** 
 * 字母 
 */ 
public class Letter { 
 
 private String name; 
 
 public Letter(String name) { 
  this.name = name; 
 } 
 
 public String getName() { 
  return name; 
 } 
} 
/** 
 * 一個發生字母對象的 享元工場(單例工場) 
 */ 
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); 
 } 
 //添加字母對象 
 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 + "")); 
  } 
 } 
} 


打印:

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 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved