享元模式(不重要):
對象結構型模式,通過共享技術實作大量相同或相似細粒度對象的複用
細粒度對象:在實際使用中,能夠共享的内部狀态是有限的,是以享元對象通常設計為較小的對象,包含的内部狀态較少,這種對象成為細粒度對象
内部狀态:存儲在享元對象内部,不随環境而改變的狀态稱為内部狀态
外部狀态:需要外部設定,随環境而改變的狀态稱為外部狀态
享元模式的結構:享元工廠(負責維護一個享元池,享元池中存儲具有相同内部狀态的享元對象,針對抽象享元類程式設計,可以與單例模式和簡單工廠模式結合),抽象享元類(定義享元類找中公共的方法),具體享元類,非共享享元類
享元模式的适用場景:
1.系統中有大量相同或相似的對象,為節約記憶體空間
2.維護享元池需要耗費資源,應當在大量重複使用享元對象時使用享元模式
享元模式的優點:
1.減少記憶體中細粒度對象的數量,節約記憶體空間,提高系統性能
2.内外部狀态互相對立,使得享元對象可以在不同的環境中被共享
享元模式的缺點:
1.使系統更加複雜,需要分離出内外部狀态,邏輯更加複雜
2.從享元池中讀取享元對象運作時間長
享元模式的例子(模拟字元串常量池)
享元工廠
public class FlyweightFactory {
private static Map<String, AbsFlyweight> flyweightPool = new HashMap<String, AbsFlyweight>();
public static void setFlyweightPool(AbsFlyweight absFlyweight) {
flyweightPool.put(absFlyweight.getStr(), absFlyweight);
}
public static AbsFlyweight getFlyweight(String key) {
if (flyweightPool.get(key)!=null) {
System.out.println("享元池中已有該字元串,直接傳回。。。");
return flyweightPool.get(key);
}else {
System.out.println("享元池中沒有該字元串,建立對象并傳回。。。");
AbsFlyweight newStr = new MyString(key);
flyweightPool.put(key, newStr);
return newStr;
}
}
}
抽象享元類
public interface AbsFlyweight {
String getStr();
void printStr();
}
享元類
public class MyString implements AbsFlyweight{
private String str;
public MyString(String str) {
this.str = str;
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @return
* @throws
* @return
* @see structual.FlyweightPattern.AbsFlyweight#getLength()
*/
@Override
public String getStr() {
return this.str;
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月11日
* @throws
* @return
* @see structual.FlyweightPattern.AbsFlyweight#printStr()
*/
@Override
public void printStr() {
System.out.println(str.toString());
}
}
享元模式的應用:
1.java中的字元串