最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++享元模式詳解

 更新時間:2021年09月14日 08:41:15   作者:酸菜。  
這篇文章主要為大家詳細介紹了C++設(shè)計模式之享元模式Flyweight,具有一定的參考價值,感興趣的小伙伴們可以參考一下

未引入享元模式

#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) {} //構(gòu)造函數(shù)			
};
/*棋子類*/
class Piece 
{
public:
	//構(gòu)造函數(shù)
	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()
{
	//檢測內(nèi)存泄漏
	_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;
}

在這里插入圖片描述

對于上面的例程來說,棋子的類型無非就是兩種,黑和白,在實際的下棋過程當中,只有位置是不一樣的,但是卻衍生出了多個具有相似度的對象,我們能否進行改造一下,比如,對象只有兩個,黑和白,在實際的運轉(zhuǎn)的時候,改變他們的位置就可以了,這樣就不用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) {} //構(gòu)造函數(shù)			
};
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 //創(chuàng)建棋子的工廠
{
public:
	virtual ~pieceFactory()
	{
		//釋放內(nèi)存
		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())
		{
			//沒有該享元對象,那么就創(chuàng)建出來
			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()
{
	//檢測內(nèi)存泄漏
	_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;
}

在這里插入圖片描述

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java中用Socket實現(xiàn)HTTP文件上傳實例

    Java中用Socket實現(xiàn)HTTP文件上傳實例

    本篇文章主要介紹了Java中用Socket實現(xiàn)HTTP文件上傳實例,詳細的介紹了通過讀取Socket的輸入流來實現(xiàn)一個文件上傳的功能,有興趣的同學可以一起了解一下
    2017-04-04
  • Java 異常java.lang.NoSuchFieldException解決方案

    Java 異常java.lang.NoSuchFieldException解決方案

    這篇文章主要介紹了Java 異常java.lang.NoSuchFieldException解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • IDEA 端口占用的解決方法(推薦)

    IDEA 端口占用的解決方法(推薦)

    這篇文章主要介紹了IDEA 端口占用的解決方法,本文通過兩種方法給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot整合MyBatis實現(xiàn)樂觀鎖和悲觀鎖的示例

    SpringBoot整合MyBatis實現(xiàn)樂觀鎖和悲觀鎖的示例

    這篇文章主要介紹了SpringBoot整合MyBatis實現(xiàn)樂觀鎖和悲觀鎖的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • 詳解Java中實現(xiàn)SHA1與MD5加密算法的基本方法

    詳解Java中實現(xiàn)SHA1與MD5加密算法的基本方法

    這篇文章主要介紹了詳解Java中實現(xiàn)SHA1與MD5加密算法的基本方法,安全哈希算法第一版和消息摘要算法第五版也是通常人們最常用的加密算法,需要的朋友可以參考下
    2016-04-04
  • java微信開發(fā)API第四步 微信自定義個性化菜單實現(xiàn)

    java微信開發(fā)API第四步 微信自定義個性化菜單實現(xiàn)

    這篇文章主要為大家詳細介紹了java微信開發(fā)API第四步,自定義菜單以及個性化菜單實現(xiàn) ,感興趣的小伙伴們可以參考一下
    2016-06-06
  • java實現(xiàn)給出分數(shù)數(shù)組得到對應名次數(shù)組的方法

    java實現(xiàn)給出分數(shù)數(shù)組得到對應名次數(shù)組的方法

    這篇文章主要介紹了java實現(xiàn)給出分數(shù)數(shù)組得到對應名次數(shù)組的方法,涉及java針對數(shù)組的遍歷、排序及運算的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • Java中static與instance的區(qū)別及作用詳解

    Java中static與instance的區(qū)別及作用詳解

    這篇文章主要為大家介紹了Java中static與instance的區(qū)別及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Mybatis圖文并茂講解分頁插件

    Mybatis圖文并茂講解分頁插件

    使用過mybatis的人都知道,mybatis本身就很小且簡單,sql寫在xml里,統(tǒng)一管理和優(yōu)化。缺點當然也有,比如我們使用過程中,要使用到分頁,如果用最原始的方式的話,1.查詢分頁數(shù)據(jù),2.獲取分頁長度,也就是說要使用到兩個方法才能完成分頁
    2022-07-07
  • JAVA使用JDBC連接oracle數(shù)據(jù)庫的詳細過程

    JAVA使用JDBC連接oracle數(shù)據(jù)庫的詳細過程

    JDBC是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成,下面這篇文章主要給大家介紹了關(guān)于JAVA使用JDBC連接oracle數(shù)據(jù)庫的詳細過程,需要的朋友可以參考下
    2023-05-05

最新評論

峨边| 彩票| 北安市| 韶关市| 阿勒泰市| 浦江县| 德庆县| 龙门县| 邵东县| 习水县| 桂平市| 恩施市| 娄烦县| 富源县| 东兰县| 东辽县| 收藏| 墨竹工卡县| 汉寿县| 淄博市| 塔城市| 邻水| 文登市| 嵊州市| 临夏市| 昌邑市| 嘉义市| 虹口区| 江安县| 景谷| 永川市| 融水| 鄂伦春自治旗| 疏附县| 武川县| 广昌县| 永顺县| 息烽县| 金秀| 调兵山市| 衡阳县|