1. 程式人生 > >享元模式(Flyweight)

享元模式(Flyweight)

結果 技術 ted generated 數據 print 存在 cst static

享元模式可以分成單純享元模式復合享元模式兩種形式。

技術分享圖片

單純享元模式所涉及到的角色如下:

  • 抽象享元(Flyweight)角色 :給出一個抽象接口,以規定出所有具體享元角色需要實現的方法。

  • 具體享元(ConcreteFlyweight)角色:實現抽象享元角色所規定出的接口。如果有內蘊狀態的話,必須負責為內蘊狀態提供存儲空間。

  • 享元工廠(FlyweightFactory)角色 :本角色負責創建和管理享元角色。本角色必須保證享元對象可以被系統適當地共享。當一個客戶端對象調用一個享元對象的時候,享元工廠角色會檢查系統中是否已經有一個符合要求的享元對象。如果已經有了,享元工廠角色就應當提供這個已有的享元對象;如果系統中沒有一個適當的享元對象的話,享元工廠角色就應當創建一個合適的享元對象。

抽象享元接口

public interface Flyweight {
//一個示意性方法,參數state是外蘊狀態
public void operation(String state);
}

public class ConcreteFlyweight implements Flyweight {
private Character intrinsicState = null;
/**
* 構造函數,內蘊狀態作為參數傳入
* @param state
*/
public ConcreteFlyweight(Character state){
this.intrinsicState = state;
}

/**
* 外蘊狀態作為參數傳入方法中,改變方法的行為,
* 但是並不改變對象的內蘊狀態。
*/
@Override
public void operation(String state) {
// TODO Auto-generated method stub
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("Extrinsic State = " + state);
}
}

享元工廠角色類,必須指出的是,客戶端不可以直接將具體享元類實例化,而必須通過一個工廠對象,利用一個factory()方法得到享元對象

public class FlyweightFactory {
private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();

public Flyweight factory(Character state){
//先從緩存中查找對象
Flyweight fly = files.get(state);
if(fly == null){
//如果對象不存在則創建一個新的Flyweight對象
fly = new ConcreteFlyweight(state);
//把這個新的Flyweight對象添加到緩存中
files.put(state, fly);
}
return fly;
}
}

客戶端類

public class Client {

public static void main(String[] args) {
// TODO Auto-generated method stub
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly = factory.factory(new Character(‘a‘));
fly.operation("First Call");

fly = factory.factory(new Character(‘b‘));
fly.operation("Second Call");

fly = factory.factory(new Character(‘a‘));
fly.operation("Third Call");
}
}

結果:

技術分享圖片

該模式比較簡單,享元工廠類裏面的處理可以解決數據庫中的數據問題,例如:我們要獲取數據庫數據的key 相同,value 不相同(獲取value是一個集合),采用此方法可以解決問題,

復合享元模式:

對象是不共享的

個人感覺用的比較少,就不寫了。

享元模式(Flyweight)