C++设计模式--享元模式

桥接模式是一种简化对象管理和减少内存消耗的设计模式。适用于需要大量相似对象的场景,通过共享内部状态来减少实例数量。该模式在五子棋游戏中得以体现,棋子颜色作为内部状态被共享,位置则作为外部状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

桥接模式(Flyweight Pattern)

定义

运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。

 

常用场景

  • 系统中存在大量的相似对象
  • 细粒度的对象都具有较接近的外部状态,而内部状态和环境无关。
  • 需要缓冲池的场景


优点

是一个简单的模式,可以大大减少程序创建的对象,降低内存占用,增强性能

 

缺点

提高系统复杂性,需要分离状态,且外部状态不应该随着内部状态的改变而改变

 

C++实现

举例:五子棋

一个棋盘上可以下很多五子棋,但五子棋只有黑白两种颜色,只是位置不同而已。这时就可以采用享元模式,共享五子棋,五子棋的颜色为内部状态,位置为外部状态。

类图:


          

代码:

#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;

enum GmomokuColor
{
    BLACK,
    WHITE
};

struct GmomokuPos
{
    int m_x;
    int m_y;
    GmomokuPos(int x, int y) : m_x(x), m_y(y) {}
};

// 五子棋类
class Gomoku
{
public:
    Gomoku(GmomokuColor color) : m_color(color) {}

    ~Gomoku() {}

    void Show()
    {
        if (m_color == BLACK)
            std::cout<<"下一枚黑棋"<<std::endl;
        else
            std::cout<<"下一枚白棋"<<std::endl;
    }

private:
    GmomokuColor m_color;
};


class GomokuFactory
{
public:
    GomokuFactory(): m_pBlackGomoku(nullptr), m_pWhiteGomoku(nullptr) {}

    ~GomokuFactory() 
    {
        if (m_pBlackGomoku)
        {
            delete m_pBlackGomoku;
            m_pBlackGomoku = nullptr;
        }

        if (m_pWhiteGomoku)
        {
            delete m_pWhiteGomoku;
            m_pWhiteGomoku = nullptr;
        }

        m_blackGomokuPoss.clear();
        m_whiteGomokuPoss.clear();
    }

    void SetGomoku(GmomokuColor color, GmomokuPos pos)
    {
        if (color == BLACK)
        {
            if (m_pBlackGomoku == nullptr)
                m_pBlackGomoku = new Gomoku(BLACK);

            m_blackGomokuPoss.push_back(pos);

            std::cout<<"在("<<pos.m_x<<','<<pos.m_y<<")处";
            m_pBlackGomoku->Show();
        }
        else
        {
            if (m_pWhiteGomoku == nullptr)
                m_pWhiteGomoku = new Gomoku(WHITE);

            m_whiteGomokuPoss.push_back(pos);

            std::cout<<"在("<<pos.m_x<<','<<pos.m_y<<")处";
            m_pWhiteGomoku->Show();
        }
    }

private:
    Gomoku* m_pBlackGomoku; // 黑棋
    Gomoku* m_pWhiteGomoku; // 白棋
    std::vector<GmomokuPos> m_blackGomokuPoss;
    std::vector<GmomokuPos> m_whiteGomokuPoss;
};


void FlyweightTest()
{
    GomokuFactory* pGomokuFactory = new GomokuFactory;
    pGomokuFactory->SetGomoku(BLACK, GmomokuPos(1, 2));
    pGomokuFactory->SetGomoku(WHITE, GmomokuPos(2, 3));
    pGomokuFactory->SetGomoku(BLACK, GmomokuPos(1, 1));
    pGomokuFactory->SetGomoku(WHITE, GmomokuPos(3, 3));
    pGomokuFactory->SetGomoku(BLACK, GmomokuPos(0, 2));
    pGomokuFactory->SetGomoku(WHITE, GmomokuPos(2, 0));

    delete pGomokuFactory;
    pGomokuFactory = nullptr;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值