GreensnoWorld
记录点滴,分享乐趣,一块凝固的时间
2010.享元模式
设计模式  2023年8月3日
#include <iostream>
#include <map>
#include <vector>
using namespace std;

typedef struct pointTag
{
	int x;
	int y;
	pointTag(){}
	pointTag(int a, int b)
	{
		x = a;
		y = b;
	}
	bool operator <(const pointTag& other) const
	{
		if(x < other.x)
		{
			return true;
		}
		else if(x == other.x)
		{
			return y < other.y;
		}
		return false;
	}
}POINT;

typedef enum PieceColorTag
{
	BLACK,
	WHITE
}PIECECOLOR;

class CPiece
{
public:
	CPiece(PIECECOLOR color): m_color(color){}
	PIECECOLOR GetColor()
	{
		return m_color;
	}
	void SetPoint(POINT point)
	{
		m_point = point;
	}
	POINT GetPoint()
	{
		return m_point;
	}
protected:
	PIECECOLOR m_color;
	POINT m_point;
};

class CGomoku: public CPiece
{
public:
	CGomoku(PIECECOLOR color): CPiece(color){}
};

class CPieceFactory
{
public:
	CPiece *GetPiece(PIECECOLOR color)
	{
		CPiece *pPiece = NULL;
		if(m_vecPiece.empty())
		{
			pPiece = new CGomoku(color);
			m_vecPiece.push_back(pPiece);
		}
		else
		{
			for(vector<CPiece *>::iterator it=m_vecPiece.begin(); it!=m_vecPiece.end(); it++)
			{
				if((*it)->GetColor() == color)
				{
					pPiece = *it;
					break;
				}
			}
			if(pPiece == NULL)
			{
				pPiece = new CGomoku(color);
				m_vecPiece.push_back(pPiece);
			}
		}
		return pPiece;
	}
	~CPieceFactory()
	{
		for(vector<CPiece *>::iterator it=m_vecPiece.begin(); it!=m_vecPiece.end(); it++)
		{
			if(*it != NULL)
			{
				delete *it;
				*it = NULL;
			}
		}
	}
private:
	vector<CPiece *> m_vecPiece;
};

class CChessboard
{
public:
	void Draw(CPiece *piece)
	{
		if(piece->GetColor())
		{
			cout << "Draw a White" << " at (" << piece->GetPoint().x << "," << piece->GetPoint().y << ")" << endl;
		}
		else
		{
			cout << "Draw a Black" << " at (" << piece->GetPoint().x << "," << piece->GetPoint().y << ")" << endl;
		}
		m_mapPieces.insert(pair<POINT, CPiece *>(piece->GetPoint(), piece));
	}
	void ShowAllPieces()
	{
		for(map<POINT, CPiece *>::iterator it=m_mapPieces.begin(); it!=m_mapPieces.end(); it++)
		{
			if(it->second->GetColor())
			{
				cout << "(" << it->first.x << "," << it->first.y << ") has a White chess." << endl;
			}
			else
			{
				cout << "(" << it->first.x << "," << it->first.y << ") has a Black chess." << endl;
			}
		}
	}
private:
	map<POINT, CPiece *> m_mapPieces;
};

int main()
{
	CPieceFactory *pPieceFactory = new CPieceFactory();
	CChessboard *pChessboard = new CChessboard();

	CPiece *pPiece = pPieceFactory->GetPiece(WHITE);
	pPiece->SetPoint(POINT(2, 3));
	pChessboard->Draw(pPiece);

	pPiece = pPieceFactory->GetPiece(BLACK);
	pPiece->SetPoint(POINT(4, 5));
	pChessboard->Draw(pPiece);

	pPiece = pPieceFactory->GetPiece(WHITE);
	pPiece->SetPoint(POINT(2, 4));
	pChessboard->Draw(pPiece);

	pPiece = pPieceFactory->GetPiece(BLACK);
	pPiece->SetPoint(POINT(3, 5));
	pChessboard->Draw(pPiece);

	cout << "Show all chesses" << endl;
	pChessboard->ShowAllPieces();

	if(pChessboard != NULL)
	{
		delete pChessboard;
		pChessboard = NULL;
	}
	if(pPieceFactory != NULL)
	{
		delete pPieceFactory;
		pPieceFactory = NULL;
	}
}

 

LIJG
余本顽劣,生于紫云下,长于汝水滨。早年求学,兴趣广泛,好高骛远,学无所成,仓皇入世。兴趣所致,投身互联网,求知未证,而立已至,始悟光阴荏苒,终需务实钻研。故有此站,记录时光,积累点滴,验证所学,分享愚见。指舞方寸间,心系万千年。
留言