詳解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