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)
绘制一颗白棋
网友评论