-
享元模式:一种结构型设计模式
-
应用场景:
想象这样一个场景,设计一个两人下棋的小游戏。
一方持黑,一方持白,在玩家点击棋盘时,将对应颜色的棋子画在棋盘上。
对于白子来说,其属性包括形状、颜色和位置等。其中形状和颜色,对于一方而言,每次摆放时都是相同的属性,不同的只有位置。
所以如果每次摆放时都重新对棋子对象设置所有的属性然后描绘在棋盘上,是没有必要的。
如果在每局开始第一次设置棋子对象属性后,将其保存起来,之后再取时,只需更改其坐标属性,而不用重新构造对象。省去了每次构造的成本。 -
实现方式:
创建一个棋子工厂类,在其中使用键值容器map,根据棋子的颜色属性作为键值。
每次取属性对象时,在map中进行寻找,如果不存在,则创建新对象并设置颜色等不变属性,如果已经存在,则直接返回已有对象。
从工厂获得棋子后只重新设置其坐标属性,然后进行棋盘上的描画。
以下是享元模式的简单代码实现
#include <iostream>
#include <string>
#include <map>
using namespace std;
//棋子坐标
struct POINT
{
int m_ix;
int m_iy;
};
//棋子类
class CPieces
{
public:
CPieces(string strColor):m_strColor(strColor){}
//设置棋子坐标的方法
void SetPosition(int ix, int iy)
{
m_stPosition.m_ix = ix;
m_stPosition.m_iy = iy;
}
//将棋子按照属性描画在棋盘上
void Draw()
{
cout << "Draw a " << m_strColor << " piece, at position " << m_stPosition.m_ix << "-" << m_stPosition.m_iy << endl;
}
private:
string m_strColor;
POINT m_stPosition;
};
//棋子工厂类
class CPiecesFactory
{
public:
CPieces* GetPiece(string strColor)
{
if(NULL == mapPieces[strColor])//如果map中原来没有
{
CPieces* pNewPieces = new CPieces(strColor);
cout << "Create a new " << strColor << " Piece " << endl;
mapPieces[strColor] = pNewPieces;
}
return mapPieces[strColor];
}
private:
map<string, CPieces*> mapPieces;//按照棋子颜色属性作为键值
};
主函数中的使用
int main()
{
CPiecesFactory* pFactory = new CPiecesFactory();
cout << "-----Round 1-----" << endl;
CPieces* pPieceA = pFactory->GetPiece("White");
pPieceA->SetPosition(1,2);
pPieceA->Draw();
cout << "-----Round 2-----" << endl;
CPieces* pPieceB = pFactory->GetPiece("Black");
pPieceB->SetPosition(3,4);
pPieceB->Draw();
cout << "-----Round 3-----" << endl;
CPieces* pPieceC = pFactory->GetPiece("White");
pPieceC->SetPosition(5,6);
pPieceC->Draw();
cout << "-----Round 4-----" << endl;
CPieces* pPieceD = pFactory->GetPiece("Black");
pPieceD->SetPosition(7,8);
pPieceD->Draw();
return 0;
}
控制台输出结果
-----Round 1-----
Create a new White piece
Draw a White piece, at position 1-2
-----Round 2-----
Create a new Black piece
Draw a Black piece, at position 3-4
-----Round 3-----
Draw a White piece, at position 5-6
-----Round 4-----
Draw a Black piece, at position 7-8
如有错误,欢迎指正
网友评论