Flyweight模式

意图:

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


适用性:

1一个应用程序使用了大量的对象

2由于使用大量的对象造成很大的开销

3对象的大多数状态都可变为外部状态

4如果删除对象的外部状态,可以用相对较少的共享对象,取代很多组对象

5应用程序不依赖于对象标识


效果:

使用FLYWEIGHT模式后,传输查找和计算外部状态都会产生开销,然而空间上的节省抵消了这些开销。

1因为共享,实例总数减少的数目

2对象内部状态的平均数目

3外部状态存储





1、抽象享元(Flyweight)角色:此角色是所有的具体享元类的基类,为这些类规定出需要实现的公共接口,通过这个接口Flyweight可以接受并作用于外部状态。
2、具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内蕴状态(Intrinsic State)的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享的。
3、享元工厂(FlyweightFactory)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。
4、客户端(Client)角色:本角色需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。


Flyweight.h

#ifndef FLYWEIGHT_H
#define FLYWEIGHT_H
#include <string>
#include <list>
typedef std::string STATE;
class Flyweight
{
public:
    virtual ~Flyweight(){}
    STATE GetIntrinsicState();
    virtual void Operation(STATE& ExtrinsicState) = 0;
protected:
    Flyweight(const STATE& state)
        :m_State(state)
    {
    }
private:
    STATE m_State;
};
class FlyweightFactory
{
public:
    FlyweightFactory(){}
    ~FlyweightFactory();
    Flyweight* GetFlyweight(const STATE& key);
private:
    std::list<Flyweight*>    m_listFlyweight;
};
class ConcreateFlyweight
    : public Flyweight
{
public:
    ConcreateFlyweight(const STATE& state)
        : Flyweight(state)
    {
    }
    virtual ~ConcreateFlyweight(){}
    virtual void Operation(STATE& ExtrinsicState);
};
#endif

Flyweight.cpp

#include "FlyWeight.h"
#include <iostream>
inline STATE Flyweight::GetIntrinsicState()
{
    return m_State;
}
FlyweightFactory::~FlyweightFactory()
{
    std::list<Flyweight*>::iterator iter1, iter2, temp;
    for (iter1 = m_listFlyweight.begin(), iter2 = m_listFlyweight.end();
        iter1 != iter2;
        )
    {
        temp = iter1;
        ++iter1;
        delete (*temp);
    }
    m_listFlyweight.clear();
}
Flyweight* FlyweightFactory::GetFlyweight(const STATE& key)
{
    std::list<Flyweight*>::iterator iter1, iter2;
    for (iter1 = m_listFlyweight.begin(), iter2 = m_listFlyweight.end();
         iter1 != iter2;
         ++iter1)
    {
        if ((*iter1)->GetIntrinsicState() == key)
        {
            std::cout << "The Flyweight:" << key << " already exits"<< std::endl;
            return (*iter1);
        }
    }
    std::cout << "Creating a new Flyweight:" << key << std::endl;
    Flyweight* flyweight = new ConcreateFlyweight(key);
    m_listFlyweight.push_back(flyweight);
}
void ConcreateFlyweight::Operation(STATE& ExtrinsicState)
{
}

main.cpp


#include "FlyWeight.h"
int main()
{
    FlyweightFactory flyweightfactory;
    flyweightfactory.GetFlyweight("hello");
    flyweightfactory.GetFlyweight("world");
    flyweightfactory.GetFlyweight("hello");
    system("pause");
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值