享元模式
- 1.什麼是享元模式
- 2.享元模式的角色
- 3.模型
- 4.例子
- 4.1 背景
- 4.2 項目結構
- 4.3 例子說明
- 4.4 中繼資料
- 4.5 中繼資料管理類
- 4.6 使用者
- 4.7 結果
- 5.總結
23種設計模式
1.什麼是享元模式
要了解享元模式首先需要了解什麼是中繼資料。
中繼資料不沒有準确的範圍,或者準确的格式。隻能是相對來說。
比如對于一篇文章,中繼資料可以是章節,可以是段落,可以是語句,可以是文字,可以是筆畫,甚至可以是像素點。。
對于文章,很多文章有一些版本聲明之類的而且每一個文章的聲明都相同,那麼版本聲明的段落就是文章的一個中繼資料。。。
享元模式就是把中繼資料用完後存起來,因為是中繼資料,使用的頻率比較高,建立一個中繼資料的難度較大。儲存起來後,再次用到中繼資料時,就不用建立了,而是可以直接使用。
享元模式與原型模式的差別:
從某種意義上來說:享元模式和原型模式的原理相似。但是這兩種模式的工作的尺度不同。
享元模式的尺度比較小,更專注于本質。原型模式的尺度較大,專注于複雜對象。
舉個例子:
享元模式更多的用在字元串和字元這一層面。
原型模式更多的用在持有某個複雜頁面的對象(或者資料對象)。
2.享元模式的角色
中繼資料:根據需求定義的中繼資料
中繼資料工廠:管理中繼資料的類
使用者:使用中繼資料的類
3.模型
間接關聯
管理
關聯
使用者
中繼資料
管理者
4.例子
4.1 背景
在Java程式中,每一個字元串都是全新的對象,即使内容相同,對象也不同。
是以字元串比較需要使用equals方法來比較,而equals方法比較的也隻是對象的内容不是對象本身。
這也是Java沒有全等于的操作符 ===
當然,基本類型是可以使用運算符直接比較的。
如果一個程式大量的使用字元串,那麼Java虛拟機的動作也是非常的頻繁,需要不停的進行垃圾回收等等。。
那麼如何實作相同的字元使用相同的對象呢?
對于Java程式來說,引用遠遠的比new對象快,比new對象更劃算(節省空間等等)
4.2 項目結構
4.3 例子說明
例子中包含2個享元模式的使用:
使用者—語句
語句----字元
4.4 中繼資料
package flyWeight;
public class Word {
private char c;
public Word(char c){
this.c = c;
}
public char getChar(){
return c;
}
}
package flyWeight;
import flyweightfactory.WordFactory;
public class Statement {
private String message;
public Statement(String message){
this.message = message;
}
public String getMessage(){
return message;
}
public void sayMessage(){
for(int i = 0;i < message.length();i++){
System.out.println(WordFactory.getInstance().getWord(message.charAt(i)).getChar());
System.out.println(WordFactory.getInstance().getWord(message.charAt(i)));
}
}
}
4.5 中繼資料管理類
package flyweightfactory;
import java.util.HashMap;
import java.util.Map;
import flyWeight.Word;
public class WordFactory {
private static WordFactory factory = new WordFactory();
private static Map<Character, Word> map = new HashMap<Character, Word>();
private WordFactory(){
}
public static WordFactory getInstance(){
return factory;
}
public synchronized Word getWord(Character c){
if(map.containsKey(c)){
return map.get(c);
} else {
Word word = new Word(c);
map.put(c, word);
return word;
}
}
}
package flyweightfactory;
import java.util.HashMap;
import java.util.Map;
import flyWeight.Statement;
public class StatementFactory {
private static StatementFactory factory = new StatementFactory();
private Map<String, Statement> map = new HashMap<String, Statement>();
private StatementFactory(){
}
public synchronized Statement getStatement(String message){
if(map.containsKey(message)){
return map.get(message);
} else {
Statement statement = new Statement(message);
map.put(message, statement);
return statement;
}
}
public static StatementFactory getInstance(){
return factory;
}
}
4.6 使用者
package client;
import flyweightfactory.StatementFactory;
public class Main {
public static void main(String[] args) {
System.out.println("李明");
System.out.println("李明說:"
+ StatementFactory.getInstance().getStatement("你好")
.getMessage()
+ StatementFactory.getInstance().getStatement("你好"));
StatementFactory.getInstance().getStatement("你好").sayMessage();
System.out.println("小華");
System.out.println("小華說:"
+ StatementFactory.getInstance().getStatement("你好")
.getMessage()
+ StatementFactory.getInstance().getStatement("你好"));
StatementFactory.getInstance().getStatement("你好").sayMessage();
StatementFactory.getInstance().getStatement("這是長篇大論").sayMessage();
System.out.println("一起說:"
+ StatementFactory.getInstance().getStatement("你好")
.getMessage()
+ StatementFactory.getInstance().getStatement("你好"));
System.out.println("你要長長的,好好的");
System.out.println(StatementFactory.getInstance().getStatement("你要長長的,好好的").getMessage()+
StatementFactory.getInstance().getStatement("你要長長的,好好的"));
StatementFactory.getInstance().getStatement("你要長長的,好好的").sayMessage();
}
}
4.7 結果
李明
李明說:你好flyWeight.Statement@e53108
你
word.Word@1f33675
好
word.Word@7c6768
小華
小華說:你好flyWeight.Statement@e53108
你
word.Word@1f33675
好
word.Word@7c6768
這
word.Word@1690726
是
word.Word@5483cd
長
word.Word@9931f5
篇
word.Word@19ee1ac
大
word.Word@1f1fba0
論
word.Word@1befab0
一起說:你好flyWeight.Statement@e53108
你要長長的,好好的
你要長長的,好好的flyWeight.Statement@13c5982
你
word.Word@1f33675
要
word.Word@1186fab
長
word.Word@9931f5
長
word.Word@9931f5
的
word.Word@14b7453
,
word.Word@c21495
好
word.Word@7c6768
好
word.Word@7c6768
的
word.Word@14b7453