前端开源框架如何提升开发效率与用户体验的关键因素
667
2022-12-09
C++享元模式详解
目录总结
#include
#include
#include
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(Enumhttp://Color::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;
}
对于上面的例程来说,棋子的类型无非就是两种,黑和白,在实际的下棋过程当中,只有位置是不一样的,但是却衍生出了多个具有相似度的对象,我们能否进行改造一下,比如,对象只有两个,黑和白,在实际的运转的时候,改变他们的位置就可以了,这样就不用new很多给相似的对象出来了。下面我们进行改造一下。引入享元模式。
#include
#include
#include
using namespace std;
enum EnBiisPwWwclumColor //棋子类型
{
Black, //黑
White //白
};
struct Positiohttp://n //棋子位置
{
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
};
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;
}
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~