美文网首页
c++享元模式

c++享元模式

作者: 一路向后 | 来源:发表于2021-02-15 19:01 被阅读0次

1.享元模式简介

   享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。

2.源码实现

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

using namespace std;

//棋子颜色
enum PieceColor {BLACK, WHITE};

//棋子位置
class PiecePos
{
public:
    int x;
    int y;

    PiecePos(int a, int b) : x(a),y(b) {};
    ~PiecePos()
    {
        //cout << "位置(" << x << "," << y << ")已销毁" << endl;
    }
};

//棋子定义
class Piece
{
protected:
    PieceColor m_color;

public:
    Piece(PieceColor color) : m_color(color){};
    ~Piece(){};
    virtual void Draw() {};
};

class BlackPiece : public Piece
{
public:
    BlackPiece(PieceColor color) : Piece(color){};
    ~BlackPiece(){};
    virtual void Draw()
    {
        cout << "绘制一颗黑棋" << endl;
    }
};

class WhitePiece : public Piece
{
public:
    WhitePiece(PieceColor color) : Piece(color){};
    virtual void Draw()
    {
        cout << "绘制一颗白棋" << endl;
    }
};

//定义棋盘
class PieceBoard
{
private:
    vector<PiecePos>m_vecPiecePos;
    Piece *m_blackPiece;
    Piece *m_whitePiece;
    string m_blackName;
    string m_whiteName;

public:
    PieceBoard(string black, string white) : m_blackName(black), m_whiteName(white)
    {
        m_blackPiece = new BlackPiece(BLACK);
        m_whitePiece = new WhitePiece(WHITE);
    }

    ~PieceBoard(){ Clear(); }

    void SetPiece(PieceColor color, PiecePos pos)
    {
        Piece *piece = NULL;

        if(color == BLACK)
        {
            piece = m_blackPiece;

            cout << m_blackName << "在位置(" << pos.x << "," << pos.y << ")" << endl;

            piece->Draw();
        }
        else
        {
            piece = m_whitePiece;

            cout << m_whiteName << "在位置(" << pos.x << "," << pos.y << ")" << endl;

            piece->Draw();
        }

        m_vecPiecePos.push_back(pos);
    }

    void Clear()
    {
        m_vecPiecePos.clear();

        delete m_whitePiece;
        delete m_blackPiece;
    }
};

int main(int argc, char **argv)
{
    PieceBoard pieceBoard("A","B");
    pieceBoard.SetPiece(BLACK, PiecePos(4, 4));
    pieceBoard.SetPiece(WHITE, PiecePos(4, 16));
    pieceBoard.SetPiece(BLACK, PiecePos(16, 4));
    pieceBoard.SetPiece(WHITE, PiecePos(16, 16));

    return 0;
}

3.编译源码

$ g++ -o example example.cpp

4.运行及其结果

$ ./example
A在位置(4,4)
绘制一颗黑棋
B在位置(4,16)
绘制一颗白棋
A在位置(16,4)
绘制一颗黑棋
B在位置(16,16)
绘制一颗白棋

相关文章

网友评论

      本文标题:c++享元模式

      本文链接:https://www.haomeiwen.com/subject/ksxmxltx.html