千家信息网

C++中享元模式的示例分析

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,小编给大家分享一下C++中享元模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!示例#include #incl
千家信息网最后更新 2026年11月04日C++中享元模式的示例分析

小编给大家分享一下C++中享元模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

示例

#include #include #include using namespace std;enum class  EnumColor //棋子类型{        Black, //黑        White  //白};struct Position //棋子位置{        int m_x;        int m_y;        Position(int tmpx, int tmpy) :m_x(tmpx), m_y(tmpy) {} //构造函数                 };/*棋子类*/class Piece {public:        //构造函数        Piece(EnumColor tmpcolor, Position tmppos) :m_color(tmpcolor), m_pos(tmppos){}        //棋子的绘制        void draw()        {                if(m_color == EnumColor::Black)                {                        cout << "在位置:(" << m_pos.m_x << "," << m_pos.m_y << ")处绘制了一个黑色棋子!" << endl;                }                else                {                        cout << "在位置:(" << m_pos.m_x << "," << m_pos.m_y << ")处绘制了一个白色棋子!" << endl;                }        }private:        EnumColor m_color; //棋子颜色        Position m_pos; //棋子位置};int main(){        //检测内存泄漏        _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);        Piece* p_piece1 = new Piece(EnumColor::Black, Position(3, 3)); //黑色落子到3,3位置        p_piece1->draw();        Piece* p_piece2 = new Piece(EnumColor::White, Position(5, 5)); //白色落子到5,5位置        p_piece2->draw();        Piece* p_piece3 = new Piece(EnumColor::Black, Position(4, 6)); //黑色落子到4,6位置        p_piece3->draw();        Piece* p_piece4 = new Piece(EnumColor::White, Position(5, 7)); //白色落子到5,7位置        p_piece4->draw();        //释放资源        delete p_piece1;        delete p_piece2;        delete p_piece3;        delete p_piece4;        return 0;}


对于上面的例程来说,棋子的类型无非就是两种,黑和白,在实际的下棋过程当中,只有位置是不一样的,但是却衍生出了多个具有相似度的对象,我们能否进行改造一下,比如,对象只有两个,黑和白,在实际的运转的时候,改变他们的位置就可以了,这样就不用new很多给相似的对象出来了。下面我们进行改造一下。引入享元模式。

#include #include #include using namespace std;enum EnumColor //棋子类型{        Black, //黑        White  //白};struct Position //棋子位置{        int m_x;        int m_y;        Position(int tmpx, int tmpy) :m_x(tmpx), m_y(tmpy) {} //构造函数                 };class Piece //棋子抽象类{public:        virtual ~Piece() {} public:        virtual void draw(Position tmppos) = 0;};class BlackPiece :public Piece //黑色棋子{public:        virtual void draw(Position tmppos)        {                cout << "在位置:(" << tmppos.m_x << "," << tmppos.m_y << ")处绘制了一个黑色棋子!" << endl;        }};class WhitePiece :public Piece //白色棋子{public:        virtual void draw(Position tmppos)        {                cout << "在位置:(" << tmppos.m_x << "," << tmppos.m_y << ")处绘制了一个白色棋子!" << endl;        }};class pieceFactory //创建棋子的工厂{public:        virtual ~pieceFactory()        {                //释放内存                for(auto iter = m_FlyWeightMap.begin(); iter != m_FlyWeightMap.end(); ++iter)                {                        Piece* tmpfw = iter->second;                        delete tmpfw;                }                m_FlyWeightMap.clear();         }        //获取享元对象,也就是获取被共享的棋子对象        Piece* getFlyWeight(EnumColor tmpcolor)        {                auto iter = m_FlyWeightMap.find(tmpcolor);                if(iter == m_FlyWeightMap.end())                {                        //没有该享元对象,那么就创建出来                        Piece* tmpfw = nullptr;                        if(tmpcolor == Black) //黑子                        {                                tmpfw = new BlackPiece();                        }                        else //白子                        {                                tmpfw = new WhitePiece();                        }                        //以棋子颜色枚举值作为key,增加条目到map中                        m_FlyWeightMap.insert(make_pair(tmpcolor, tmpfw));                         return tmpfw;                }                else                {                        return iter->second;                }        }private:        std::map m_FlyWeightMap; //享元池,用map容器来保存所有的享元对象,一共就两个享元对象(黑色棋子一个,白色棋子一个)};int main(){        //检测内存泄漏        _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);        pieceFactory* pfactory = new pieceFactory();        Piece* p_piece1 = pfactory->getFlyWeight(Black);        p_piece1->draw(Position(3, 3));  //黑子落子到3,3位置        Piece* p_piece2 = pfactory->getFlyWeight(White);        p_piece2->draw(Position(5, 5));  //白子落子到5,5位置        Piece* p_piece3 = pfactory->getFlyWeight(Black);        p_piece3->draw(Position(4, 6));  //黑子落子到4,6位置        Piece* p_piece4 = pfactory->getFlyWeight(White);        p_piece4->draw(Position(5, 7));  //白子落子到5,7位置        //释放资源        delete  pfactory;        return 0;}

以上是"C++中享元模式的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

棋子 位置 对象 白色 黑色 模式 示例 函数 白子 篇文章 类型 黑子 C++ 分析 相似 两个 内容 只有 实际 资源 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州大一互联网络科技有限公司 为想互联网科技怎么样 科技金融是不是互联网金融 金融科技还是互联网 互联网科技开发公司 金融科技与互联网金融 互联网 科技创业 齐家互联网科技 朗涯互联网科技 互联网科技股有哪些 互联网科技类展会 茂名市互联网科技产业园 语蝶互联网科技有限公司 允成互联网科技有限公司融资 西安小鹰速贷互联网科技有限公司 小米互联网科技园入驻 江苏互联网科技小贷 科技互联网专业务虚会材料 宁波允成互联网科技有限公司 山东亿川互联网科技有限责任公司 润盈互联网科技 深圳育鹏互联网科技有限公司招聘 亳州好赞互联网科技有限公司 中和天地互联网科技有限公司 互联网科技数字货币 富国互联网科技002692 南京一网一红互联网科技有限公司 杭州融税互联网科技有限公司 互联网科技品牌 中国主要互联网科技公司
0