設計模式之享元模式【Flyweight Pattern】
阿新 • • 發佈:2019-02-19
享元模式是物件池的一種實現,用來儘可能減少記憶體使用量,它適合用於可能存在大量重複物件的場景,來快取可共享的物件,達到物件共享、避免建立過多物件的效果。可以提升效能。避免記憶體移除等。
1、定義
使用共享物件可有效地支援大量的細粒度的物件。
2、使用場景
- 系統中存在大量相似物件。
- 細粒度的物件都具備較接近的外部狀態,並且內部狀態與環境無關。
- 需要緩衝池的場景。
3、UML圖
4、程式碼示例
享元類定義
public interface Flyweight {
// 示意性方法,引數state是外部狀態
public void doSomething (String externalState);
}
public class ConcreteFlyweight implements Flyweight {
//內部狀態,初始化後就不變了
private String intrinsicState = null;
/**
* 建構函式,內部狀態作為引數傳入
*
* @param state
*/
public ConcreteFlyweight(String state) {
this.intrinsicState = state;
}
/**
* 外部狀態作為引數傳入方法中,改變方法的行為, 但是並不改變物件的內部狀態。
*/
@Override
public void doSomething(String externalState) {
//具體的功能邏輯,可能會用到享元內部、外部狀態
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("External State = " + externalState);
}
}
享元工廠:
public class FlyweightFactory {
private Map<String, Flyweight> maps = new HashMap<String, Flyweight>();
public Flyweight getFlyweight(String state) {
// 1、先從快取中查詢物件
Flyweight fly = maps.get(state);
// 2、如果物件不存在則建立一個新的享元物件
if (fly == null) {
System.out.println("享元物件池沒有,新建立一個物件");
fly = new ConcreteFlyweight(state);
// 2.1、 把這個新的享元物件新增到快取中
maps.put(state, fly);
} else {
System.out.println("在享元物件池找到快取物件,直接返回");
}
// 3、返回享元物件
return fly;
}
}
客戶端呼叫:
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly = factory.getFlyweight("男的");
fly.doSomething("寫程式碼");
System.out.print("\n");
fly = factory.getFlyweight("女的");
fly.doSomething("做美工圖片");
System.out.print("\n");
fly = factory.getFlyweight("男的");
fly.doSomething("修電腦");
}
}
呼叫輸出: