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

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

    一個例子:
    抽象享元類

    package?flyweight;

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

    public?class?ConcreteFlyweight?extends?Flyweight{
    ????
    private?Character?intrinsicState;
    ????
    //構(gòu)造方法,內(nèi)蘊作為參數(shù)傳入
    ????public?ConcreteFlyweight(Character?intrinsicState){
    ????????
    this.intrinsicState=intrinsicState;
    ????}

    ????
    //外蘊狀態(tài)作為參數(shù)傳入方法中,忙亂改變的是方法的行為
    ????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(){}
    ????
    //內(nèi)蘊狀態(tài)作為參數(shù)傳入
    ????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());
    ????????
    ????}

    }
    運行結(jié)果:
    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與模式》
    《設(shè)計模式速查手冊》
    http://blog.csdn.net/qutr/archive/2006/07/27/987233.aspx