亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中享元模式的示例分析

發布時間:2021-09-13 15:15:14 來源:億速云 閱讀:132 作者:小新 欄目:開發技術

小編給大家分享一下C++中享元模式的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

示例

#include <iostream>
#include <list>
#include <map>
using namespace std;

enum class  EnumColor //棋子類型
{
	Black, //黑
	White  //白
};
struct Position //棋子位置
{
	int m_x;
	int m_y;
	Position(int tmpx, int tmpy) :m_x(tmpx), m_y(tmpy) {} //構造函數			
};
/*棋子類*/
class Piece 
{
public:
	//構造函數
	Piece(EnumColor tmpcolor, Position tmppos) :m_color(tmpcolor), m_pos(tmppos){}
	//棋子的繪制
	void draw()
	{
		if(m_color == EnumColor::Black)
		{
			cout << "在位置:(" << m_pos.m_x << "," << m_pos.m_y << ")處繪制了一個黑色棋子!" << endl;
		}
		else
		{
			cout << "在位置:(" << m_pos.m_x << "," << m_pos.m_y << ")處繪制了一個白色棋子!" << endl;
		}
	}
private:
	EnumColor m_color; //棋子顏色
	Position m_pos; //棋子位置
};
int main()
{
	//檢測內存泄漏
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
	Piece* p_piece1 = new Piece(EnumColor::Black, Position(3, 3)); //黑色落子到3,3位置
	p_piece1->draw();
	Piece* p_piece2 = new Piece(EnumColor::White, Position(5, 5)); //白色落子到5,5位置
	p_piece2->draw();
	Piece* p_piece3 = new Piece(EnumColor::Black, Position(4, 6)); //黑色落子到4,6位置
	p_piece3->draw();
	Piece* p_piece4 = new Piece(EnumColor::White, Position(5, 7)); //白色落子到5,7位置
	p_piece4->draw();
	//釋放資源
	delete p_piece1;
	delete p_piece2;
	delete p_piece3;
	delete p_piece4;
	return 0;
}

C++中享元模式的示例分析

對于上面的例程來說,棋子的類型無非就是兩種,黑和白,在實際的下棋過程當中,只有位置是不一樣的,但是卻衍生出了多個具有相似度的對象,我們能否進行改造一下,比如,對象只有兩個,黑和白,在實際的運轉的時候,改變他們的位置就可以了,這樣就不用new很多給相似的對象出來了。下面我們進行改造一下。引入享元模式。

#include <iostream>
#include <list>
#include <map>
using namespace std;

enum EnumColor //棋子類型
{
	Black, //黑
	White  //白
};
struct Position //棋子位置
{
	int m_x;
	int m_y;
	Position(int tmpx, int tmpy) :m_x(tmpx), m_y(tmpy) {} //構造函數			
};
class Piece //棋子抽象類
{
public:
	virtual ~Piece() {} 
public:
	virtual void draw(Position tmppos) = 0;
};

class BlackPiece :public Piece //黑色棋子
{
public:
	virtual void draw(Position tmppos)
	{
		cout << "在位置:(" << tmppos.m_x << "," << tmppos.m_y << ")處繪制了一個黑色棋子!" << endl;
	}
};

class WhitePiece :public Piece //白色棋子
{
public:
	virtual void draw(Position tmppos)
	{
		cout << "在位置:(" << tmppos.m_x << "," << tmppos.m_y << ")處繪制了一個白色棋子!" << endl;
	}
};

class pieceFactory //創建棋子的工廠
{
public:
	virtual ~pieceFactory()
	{
		//釋放內存
		for(auto iter = m_FlyWeightMap.begin(); iter != m_FlyWeightMap.end(); ++iter)
		{
			Piece* tmpfw = iter->second;
			delete tmpfw;
		}
		m_FlyWeightMap.clear(); 
	}
	//獲取享元對象,也就是獲取被共享的棋子對象
	Piece* getFlyWeight(EnumColor tmpcolor)
	{
		auto iter = m_FlyWeightMap.find(tmpcolor);
		if(iter == m_FlyWeightMap.end())
		{
			//沒有該享元對象,那么就創建出來
			Piece* tmpfw = nullptr;
			if(tmpcolor == Black) //黑子
			{
				tmpfw = new BlackPiece();
			}
			else //白子
			{
				tmpfw = new WhitePiece();
			}
			//以棋子顏色枚舉值作為key,增加條目到map中
			m_FlyWeightMap.insert(make_pair(tmpcolor, tmpfw)); 
			return tmpfw;
		}
		else
		{
			return iter->second;
		}
	}
private:
	std::map<EnumColor, Piece*> m_FlyWeightMap; //享元池,用map容器來保存所有的享元對象,一共就兩個享元對象(黑色棋子一個,白色棋子一個)
};
int main()
{
	//檢測內存泄漏
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
	pieceFactory* pfactory = new pieceFactory();
	Piece* p_piece1 = pfactory->getFlyWeight(Black);
	p_piece1->draw(Position(3, 3));  //黑子落子到3,3位置
	Piece* p_piece2 = pfactory->getFlyWeight(White);
	p_piece2->draw(Position(5, 5));  //白子落子到5,5位置
	Piece* p_piece3 = pfactory->getFlyWeight(Black);
	p_piece3->draw(Position(4, 6));  //黑子落子到4,6位置
	Piece* p_piece4 = pfactory->getFlyWeight(White);
	p_piece4->draw(Position(5, 7));  //白子落子到5,7位置
	//釋放資源
	delete  pfactory;
	return 0;
}

C++中享元模式的示例分析

C++中享元模式的示例分析

以上是“C++中享元模式的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

丰镇市| 利津县| 海原县| 河间市| 特克斯县| 扶绥县| 通海县| 临江市| 名山县| 印江| 博野县| 樟树市| 西安市| 积石山| 乐安县| 石首市| 老河口市| 鹤峰县| 佛冈县| 金乡县| 冷水江市| 阿拉善右旗| 河源市| 化德县| 诸暨市| 江安县| 元阳县| 长春市| 顺昌县| 民权县| 广南县| 华蓥市| 宾川县| 益阳市| 灌阳县| 灵宝市| 周宁县| 二连浩特市| 吴旗县| 博罗县| 临江市|