享元模式(c++實現)
阿新 • • 發佈:2020-07-17
# 享元模式
[TOC]
## 模式定義
**享元模式(Flyweight)**,運用共享技術有效的支援大量細粒度的物件。
## 模式動機
- 如果一個應用使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時就應該考慮使用。
- 當物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享記憶體物件取代很多組物件,此時可以考慮使用享元模式。
## UML類圖
![](https://files-cdn.cnblogs.com/files/wzxNote/%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F.bmp)
## 原始碼實現
- piece.h
```c++
#include
enum Color
{
white,
black
};
class Piece
{
public:
Piece(Color color);
void setPoint(int x, int y);
Color GetColor() const;
public:
int m_X;
int m_Y;
private:
Color m_Color;
};
```
- piece.cpp
```c++
#include "piece.h"
Piece::Piece(Color color)
:m_Color(color)
{
}
void Piece::setPoint(int x, int y)
{
m_X = x;
m_Y = y;
}
Color Piece::GetColor() const
{
return m_Color;
}
```
- checkerboard.h
```c++
#include
#include "piece.h"
class CheckerBoard
{
public:
CheckerBoard();
void Draw();
void refresh();
void GetPiece(const Piece& piece);
private:
std::string m_Checker;
};
```
- checkerboard.cpp
```c++
#include
#include
#include "checkerboard.h"
CheckerBoard::CheckerBoard()
{
for(int m = 0; m < 20; ++m)
{
for(int n = 0; n < 20; ++n)
m_Checker.append("o");
m_Checker.append("\n");
}
}
void CheckerBoard::Draw()
{
std::cout << m_Checker;
}
void CheckerBoard::refresh()
{
system("cls");
std::cout << m_Checker;
}
void CheckerBoard::GetPiece(const Piece& piece)
{
int pos;
pos = (piece.m_Y * 21) + piece.m_X;
if(piece.GetColor() == Color::white)
m_Checker.replace(pos, 1, "-");
else if(piece.GetColor() == Color::black)
m_Checker.replace(pos, 1, "+");
}
```
- piecefactory.h
```c++
#include