??? 享元模式:運用共享技術有效地支持大量細粒度的對象,避免大量擁有相同內容的小類的開銷(如耗費內存),使大家共享一個類(元類).
? 適用環境:
  • 一個應用程序使用了大量的對象。
  • 完全由于使用大量的對象,造成很大的存儲開銷。
  • 對象的大多數狀態都可變為外部狀態。
  • 如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象。
  • 應用程序不依賴于對象標識。由于Flyweight對象可以被共享,對于概念上明顯有別的對象,標識測試將返回真值

    未命名44.bmp
    一個具體例子:
    它涉及到四個角色:
    抽象享元角色:此角色是所有具體享元類的超類,為這些類規定需要的接口,那些需要外蘊狀態(External State)的操作可以調用商業的方法以參數方式傳入。
    具體享元角色:實現抽象享元所規定的接口,如果有內蘊狀態,則必須負責為內蘊提供存儲空間。享元對象的內蘊狀態必須與外部環境無關,從而使得享元對象在系統內共享。
    享元工廠角色:負責創建與管理享元角色。本角色必須保證享元對象可以在系統內適當共享.
    客戶端角色:維護一個對所有享元對象的引用,需要自行存儲所有享元對象的外蘊狀態。?

    一個例子:
    抽象享元類

    package?flyweight;

    public?abstract?class?Flyweight{
    ????
    //state是一個外蘊狀態
    ????public?abstract?void?operation(String?state);
    }
  • 具體享元類:
    package?flyweight;

    public?class?ConcreteFlyweight?extends?Flyweight{
    ????
    private?Character?intrinsicState;
    ????
    //構造方法,內蘊作為參數傳入
    ????public?ConcreteFlyweight(Character?intrinsicState){
    ????????
    this.intrinsicState=intrinsicState;
    ????}

    ????
    //外蘊狀態作為參數傳入方法中,忙亂改變的是方法的行為
    ????public?void?operation(String?state){
    ????????System.out.println(
    "IntrinsicState:"+intrinsicState+"?extrinsic?state:"+state);
    ????}

    ????
    }
    享元工廠類:
    package?flyweight;

    import?java.util.*;

    public?class?FlyweightFactory{
    ????
    private?HashMap?files=new?HashMap();

    ????
    ????
    public?FlyweightFactory(){}
    ????
    //內蘊狀態作為參數傳入
    ????public?Flyweight?factory(Character?state){
    ????????
    if(files.containsKey(state))
    ????????????
    return?(Flyweight)files.get(state);
    ????????
    else
    ?????????
    {
    ?????????????????Flyweight?fly
    =new?ConcreteFlyweight(state);
    ?????????????????files.put(state,fly);
    ?????????????????
    return?fly;??????
    ?????????}

    ????}

    ????
    ????
    public?int?getSize(){
    ????????
    return?files.size();
    ????}

    }
    客戶類:
    package?flyweight;

    public?class?FlyweightPattern{
    ????
    public?static?void?main(String[]?args){
    ????????
    ????????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");
    ????????System.out.println(factory.getSize());
    ????????
    ????}

    }
    運行結果:
    IntrinsicState:a extrinsic state:first Call
    IntrinsicState:b extrinsic state:second Call
    IntrinsicState:a extrinsic state:Third Call
    2
    Press any key to continue...

    參考資料:《Java與模式》
    《設計模式速查手冊》
    http://blog.csdn.net/qutr/archive/2006/07/27/987233.aspx