Flyweight(享元)--对象结构型模式

1.意图

    运用共享技术有效地支持大量细粒度的对象。

2.动机

    Flyweight模式描述了如何共享对象,使得可以细粒度地使用它们,而无需高昂的代价。flyweight是一个共享对象,它可以同时在多个场景(context)中使用,并且在每个场景中flyweight都可以作为一个独立的对象---这一点与非共享对象的实例没有区别。

3.适用性

  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量的对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

4.结构图

    

 

5.代码实例

    

//Flyweight.h



#include <string>

class FlweightGraphicBase
{
public:
    virtual void PrintColor()=0;
protected:
    std::string m_Color;
};

class FlweightWhiteGraphic : public FlweightGraphicBase
{
public:
    FlweightWhiteGraphic();
    void PrintColor();
};

class FlweightBlackGraphic : public FlweightGraphicBase
{
public:
    FlweightBlackGraphic();
    void PrintColor();
};
//FlyweigtFactory.h



#include <string>
#include <memory>
#include <map>

class FlweightGraphicBase;

class FlyweightFactory
{
public:
    std::shared_ptr<FlweightGraphicBase> GetFlyweight(std::string sColor);
    void SetFlyweight(std::string sColor,
        std::shared_ptr<FlweightGraphicBase> pFlyweight);

private:
    std::map <std::string,std::shared_ptr<FlweightGraphicBase>> m_mapFlyweight;
};
//Flyweight.cpp

#include "Flyweight.h"
#include <iostream>

FlweightWhiteGraphic::FlweightWhiteGraphic()
{
    m_Color = "White";
}


void FlweightWhiteGraphic :: PrintColor()
{
    std::cout<<"Color is :" << m_Color << std::endl;
}


FlweightBlackGraphic::FlweightBlackGraphic()
{
    m_Color = "Black";
}


void FlweightBlackGraphic :: PrintColor()
{
    std::cout<<"Color is :" << m_Color << std::endl;
}
//FlyweightFactory.cpp


#include "FlyweightFactory.h"


std::shared_ptr<FlweightGraphicBase> FlyweightFactory::GetFlyweight(std::string sColor)
{
    auto iter = m_mapFlyweight.find(sColor);
    if(iter == m_mapFlyweight.end())
    {
        return nullptr;
    }

    return iter->second;
}

void FlyweightFactory::SetFlyweight(std::string sColor,
        std::shared_ptr<FlweightGraphicBase> pFlyweight)
{
    m_mapFlyweight[sColor] = pFlyweight;
}
//Client.cpp



#include "Flyweight.h"
#include "FlyweightFactory.h"
#include <iostream>

void Insert(std::string sColor,
    int index,std::shared_ptr<FlweightGraphicBase> pFlweightGraphic)
{
    std::cout<<"Posion " << index << " Insert: " << sColor << std::endl ;
}

int main()
{
    std::shared_ptr<FlyweightFactory> pFlyweightFactory(new FlyweightFactory);
    std::shared_ptr<FlweightWhiteGraphic> pFlweightWhiteGraphic(new FlweightWhiteGraphic);
    std::shared_ptr<FlweightBlackGraphic> pFlweightBlackGraphic(new FlweightBlackGraphic);

    pFlyweightFactory->SetFlyweight("White",pFlweightWhiteGraphic);
    pFlyweightFactory->SetFlyweight("Black",pFlweightBlackGraphic);

    auto pFlyweight = pFlyweightFactory->GetFlyweight("White");
    Insert("White",0,pFlyweight);

    pFlyweight = pFlyweightFactory->GetFlyweight("Black");
    Insert("Black",1,pFlyweight);

    pFlyweight = pFlyweightFactory->GetFlyweight("White");
    Insert("White",2,pFlyweight);

    pFlyweight = pFlyweightFactory->GetFlyweight("Black");
    Insert("Black",3,pFlyweight);

    while(1);

}

6.测试结果 

    

     实例代码中 所有插入的Graphic 共享黑白两种颜色,位置信息存储在外部。

7.效果

  • 存储节约,和以下因素有关:
  • 1.因为共享,实例总数减少的数目。
  • 2.对象内部状态的平均数目。
  • 3.外部状态是计算的还是存储的。

 

posted @ 2016-06-11 15:38  沪马农  阅读(308)  评论(0编辑  收藏  举报