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

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

    一個(gè)例子:
    抽象享元類

    package?flyweight;

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

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

    ????
    //外蘊(yùn)狀態(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)蘊(yùn)狀態(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());
    ????????
    ????}

    }
    運(yùn)行結(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è)計(jì)模式速查手冊(cè)》
    http://blog.csdn.net/qutr/archive/2006/07/27/987233.aspx