天天看點

GoF設計模式-享元模式

    享元模式(不重要):

        對象結構型模式,通過共享技術實作大量相同或相似細粒度對象的複用

        細粒度對象:在實際使用中,能夠共享的内部狀态是有限的,是以享元對象通常設計為較小的對象,包含的内部狀态較少,這種對象成為細粒度對象

        内部狀态:存儲在享元對象内部,不随環境而改變的狀态稱為内部狀态

        外部狀态:需要外部設定,随環境而改變的狀态稱為外部狀态

        享元模式的結構:享元工廠(負責維護一個享元池,享元池中存儲具有相同内部狀态的享元對象,針對抽象享元類程式設計,可以與單例模式和簡單工廠模式結合),抽象享元類(定義享元類找中公共的方法),具體享元類,非共享享元類

    享元模式的适用場景:

        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中的字元串

繼續閱讀