詳解Java設計形式編程中的Flyweight享元形式的開辟構造。本站提示廣大學習愛好者:(詳解Java設計形式編程中的Flyweight享元形式的開辟構造)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java設計形式編程中的Flyweight享元形式的開辟構造正文
享元(Flyweight)形式:經由過程同享技巧以便有用的支撐年夜量細粒度的對象。
享元形式在閻宏的《java與形式》平分為純真享元形式和復合享元形式,復合形式的復合享元是弗成以同享的,享元對象能做到同享的症結是辨別內蘊態(Internal State)和外蘊態( External State)。這兩個“蘊態”翻譯的太難明,我不是說翻譯的欠好,能夠是我懂得才能差,照樣《Design Pattern Elements of Reusable Object-Oriented Software》的翻譯版《設計形式可復用面向對象軟件的基本》一書總翻譯為外部對象和內部對象,絕對直白,對概念性的器械文學氣息太強了就認為很別扭。這裡的腳色也采取《設計形式可復用面向對象軟件的基本》的說法,不辨別純真形式和復合形式,而是有一個UnSharedConcreteFlyweight(在《java與形式》裡稱復合享元,指明復合享元不克不及同享),我們這裡稱它弗成以同享享元腳色,如許享元形式的腳色有:
享元形式的類的機構圖以下:
享元形式在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