桥接模式(Flyweight Pattern)

定义

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

 

常用场景

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


优点

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

 

缺点

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

 

C++实现

举例:五子棋

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

类图:


          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;
}

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

相关文章:

  • 2021-08-05
  • 2021-06-17
  • 2021-04-04
  • 2021-10-21
猜你喜欢
  • 2022-02-08
  • 2022-12-23
  • 2021-08-26
  • 2021-07-03
相关资源
相似解决方案