设计模式_享元模式

享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

比如所有的五子棋房间的棋子都是一样的。唯一的不同是每个棋子在不同的房间的不同棋盘的不同位置上。所以,对于棋子来说,我们不用放一个棋子就new一个棋子对象,只需要在需要的时候,去请求获得对应的棋子对象,如果没有,就new一个棋子对象;如果有了,就直接返回棋子对象。这里以五子棋为例子,进行分析,当玩家在棋盘上放入第一个白色棋子时,此时由于没有白色棋子,所以就new一个白色棋子;当另一个玩家放入第一个黑色棋子时,此时由于没有黑色棋子,所以就需要new一个黑色棋子;当玩家再次放入一个白色棋子时,就去查询是否有已经存在的白色棋子对象,由于第一次已经new了一个白色棋子对象,所以,现在不会再次new一个白色棋子对象,而是返回以前new的白色棋子对象;对于黑色棋子,亦是同理;获得了棋子对象,我们只需要设置棋子的不同棋盘位置即可。

在了解享元模式之前我们先要了解两个概念:内部状态、外部状态。

       内部状态:在享元对象内部不随外界环境改变而改变的共享部分。

       外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。

内部状态存储于享元对象内部,而外部状态则应该由客户端来考虑。

#ifndef _FLYWEIGHT_H_
#define _FLYWEIGHT_H_
#include<iostream>
#include<map>
using namespace std;

//棋子
class Chess
{
public:
    Chess(string pColor):color(pColor) {}
    void setPosition(int _x,int _y)
    {
        x=_x;
        y=_y;
    }
    void draw()
    {
        cout<< x << ":" << y << "," << color << endl;
    }
private:
    //内部状态:颜色
    string color;
    //外部状态:位置
    int x;
    int y;
};

//棋盒,产生棋子
class ChessBox
{
public:
    Chess* getChess(string color)
    {
        auto it = boxMap.find(color);
        if(it != boxMap.end())
            return it->second;
        else
        {
            Chess* nChess = new Chess(color);
            boxMap[color] = nChess;
            return nChess;
        }
    }
private:
    //存储共享的棋子(仅有内部状态,颜色)
    map<string,Chess*> boxMap;        
};

#endif

int main()
{
    ChessBox* chessBox = new ChessBox();
    Chess* bChess = chessBox->getChess("black");
    bChess->setPosition(4,2);
    bChess->draw();

    Chess* wChess = chessBox->getChess("white");
    wChess->setPosition(5,3);
    wChess->draw();
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_31175231/article/details/71497554
今日推荐