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

一、概述

享元模式(Flyweight),就是利用共享技术有效地支持大量细粒度的对象。

当程序创建大量的对象时有损程序的性能,同时还容易造成内存溢出。我们将对象内部的信息进行细粒度地划分,将一部分信息提取出来进行共享,可以节省内存空间,提高程序性能。对象细粒度化后的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic)。内部状态是对象可以共享出来的信息,存储在享元对象内部,并且不会随着环境改变而改变。外部状态是随着环境改变而改变的,不可以共享的信息,存储在对象的外面,一般由客户端对象存储,当调用享元对象的操作时,将外部状态传递给享元对象。

二、享元模式的类图

三、实例

//象棋内部状态参数,总共2*11=22种,不会随着环境改变而改变
class ChessIntrisicState
{
public:
    //1:红,2:黑;总共两种
    int nColorType;
    //棋子名称:帅,将,车,炮,马,相,象,仕,士,兵,卒;总共11种
    int nChessPieceName;
};
//象棋外部状态参数,随着环境改变而改变
class ChessExtrisicState
{
public:
    int nXPos;
    int nYPos;
};

//棋子基类,对应享元基类Flyweight
class AbstractChess
{
public:
    //享元类具体操作时除了需要内部状态参数,可能还需要外部状态参数
    virtual void Play(ChessExtrisicState objExState);
};

//棋子类,对应ConcreteFlyweight
class Chess : public AbstractChess
{
public:
    Chess (ChessIntrisicState objInState)
    {
        m_objInState = objInState;
    }
    virtual void Play(ChessExtrisicState objExState);

private:
    //内部状态参数
    ChessIntrisicState m_objInState;
};

void Play(ChessExtrisicState objExState)
{
    cout<<"象棋颜色:"<<m_objInState.nColorType<<",名称:"<<m_objInState.nChessPieceName<<",在位置:"<<objExState.nXPos<<"-"<<objExState.nYPos<<endl;
}

//对应UnsharedConcreteFlyweight,为不需要共享的享元子类,由上层用户创建并维护
class UnsharedChess
{
public:
    virtual void Play(ChessExtrisicState objExState);

private:
    int m_nAllState;
};

//享元工厂类,对应FlyweightFactory
class ChessFactory
{
public:
    //获取享元对象,如果已经有了则直接返回已有的享元对象,如果没有则新建一个享元对象
    Chess* GetChess(ChessIntrisicState objKey);

private:
    map<ChessIntrisicState ,Chess*> m_mapChessList;
};
Chess* ChessFactory::GetChess(ChessIntrisicState objKey)
{
    map<int,Chess*>::iterator it = m_mapChessList.find(objKey);
    if(it != m_mapChessList.end())
    {
        return it->second;
    }
    else
    {
        Chess* pChess = new ConcreteFlyweight(nKey);
        m_mapChessList[nKey] = pFlyweight;
        return pFlyweight;
    }
}

int main()
{
    
    FlyweightFactory* pFactory = new FlyweightFactory();
    Flyweight f1 = pFactory->GetFlyweight(1);
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值