欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++享元模式詳解

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

未引入享元模式

#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 << ")處繪制了一個(gè)黑色棋子!" << endl;
		}
		else
		{
			cout << "在位置:(" << m_pos.m_x << "," << m_pos.m_y << ")處繪制了一個(gè)白色棋子!" << endl;
		}
	}
private:
	EnumColor m_color; //棋子顏色
	Position m_pos; //棋子位置
};
int main()
{
	//檢測(cè)內(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;
}

在這里插入圖片描述

對(duì)于上面的例程來(lái)說(shuō),棋子的類型無(wú)非就是兩種,黑和白,在實(shí)際的下棋過(guò)程當(dāng)中,只有位置是不一樣的,但是卻衍生出了多個(gè)具有相似度的對(duì)象,我們能否進(jìn)行改造一下,比如,對(duì)象只有兩個(gè),黑和白,在實(shí)際的運(yùn)轉(zhuǎn)的時(shí)候,改變他們的位置就可以了,這樣就不用new很多給相似的對(duì)象出來(lái)了。下面我們進(jìn)行改造一下。引入享元模式。

引入享元模式

#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 << ")處繪制了一個(gè)黑色棋子!" << endl;
	}
};

class WhitePiece :public Piece //白色棋子
{
public:
	virtual void draw(Position tmppos)
	{
		cout << "在位置:(" << tmppos.m_x << "," << tmppos.m_y << ")處繪制了一個(gè)白色棋子!" << 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(); 
	}
	//獲取享元對(duì)象,也就是獲取被共享的棋子對(duì)象
	Piece* getFlyWeight(EnumColor tmpcolor)
	{
		auto iter = m_FlyWeightMap.find(tmpcolor);
		if(iter == m_FlyWeightMap.end())
		{
			//沒(méi)有該享元對(duì)象,那么就創(chuàng)建出來(lái)
			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容器來(lái)保存所有的享元對(duì)象,一共就兩個(gè)享元對(duì)象(黑色棋子一個(gè),白色棋子一個(gè))
};
int main()
{
	//檢測(cè)內(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é)

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

相關(guān)文章

  • java中的值傳遞和引用傳遞的區(qū)別分析

    java中的值傳遞和引用傳遞的區(qū)別分析

    本文介紹了“java中的值傳遞和引用傳遞的區(qū)別分析”,需要的朋友可以參考一下
    2013-03-03
  • 詳解使用Mybatis-plus + velocity模板生成自定義的代碼

    詳解使用Mybatis-plus + velocity模板生成自定義的代碼

    這篇文章主要介紹了詳解使用Mybatis-plus + velocity模板生成自定義的代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • tomcat部署java web項(xiàng)目遇到的問(wèn)題及解決方法

    tomcat部署java web項(xiàng)目遇到的問(wèn)題及解決方法

    這篇文章主要介紹了tomcat部署java web項(xiàng)目遇到的問(wèn)題及解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • JDK動(dòng)態(tài)代理原理:只能代理接口,不能代理類問(wèn)題

    JDK動(dòng)態(tài)代理原理:只能代理接口,不能代理類問(wèn)題

    這篇文章主要介紹了JDK動(dòng)態(tài)代理原理:只能代理接口,不能代理類問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 基于javaMybatis存進(jìn)時(shí)間戳的問(wèn)題

    基于javaMybatis存進(jìn)時(shí)間戳的問(wèn)題

    這篇文章主要介紹了javaMybatis存進(jìn)時(shí)間戳的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java中Iterator(迭代器)的用法詳解

    Java中Iterator(迭代器)的用法詳解

    Java迭代器(Iterator)是?Java?集合框架中的一種機(jī)制,它提供了一種在不暴露集合內(nèi)部實(shí)現(xiàn)的情況下遍歷集合元素的方法。本文主要介紹了它的使用方法,希望對(duì)大家有所幫助
    2023-05-05
  • Java實(shí)現(xiàn)升級(jí)版布谷鳥(niǎo)闖關(guān)游戲的示例代碼

    Java實(shí)現(xiàn)升級(jí)版布谷鳥(niǎo)闖關(guān)游戲的示例代碼

    升級(jí)版布谷鳥(niǎo)闖關(guān)游戲是一個(gè)基于java的布谷鳥(niǎo)闖關(guān)游戲,鼠標(biāo)左鍵點(diǎn)擊控制鳥(niǎo)的位置穿過(guò)管道間的縫隙。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-02-02
  • Java中DateTimeFormatter的使用方法和案例

    Java中DateTimeFormatter的使用方法和案例

    在Java中,DateTimeFormatter類用于格式化和解析日期時(shí)間對(duì)象,它是日期時(shí)間格式化的強(qiáng)大而靈活的工具,本文將和大家一起探討Java中DateTimeFormatter的使用方法和案例,需要的朋友可以參考下
    2023-10-10
  • java 非對(duì)稱加密算法DH實(shí)現(xiàn)詳解

    java 非對(duì)稱加密算法DH實(shí)現(xiàn)詳解

    這篇文章主要介紹了java 非對(duì)稱加密算法DH實(shí)現(xiàn)詳解 ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • MyBatis?@Select注解介紹:基本用法與動(dòng)態(tài)SQL拼寫方式

    MyBatis?@Select注解介紹:基本用法與動(dòng)態(tài)SQL拼寫方式

    這篇文章主要介紹了MyBatis?@Select注解介紹:基本用法與動(dòng)態(tài)SQL拼寫方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評(píng)論