공유를 통해 많은 수의 소립 객체들을 효과적으로 지원한다. (GoF의 디자인 패턴 265p)
많은 객체가 사용하는 공통된 데이터나 속성을 하나의 클래스로 묶고 이 클래스를 많은 객체가 공유하도록 만들어서 데이터 크기를 줄이는 기법이다. 그래픽이 높은 게임에서 자주 사용되는 패턴으로 GPU로 전달되는 데이터를 줄여서 GPU의 부담을 덜어준다.

#include <iostream>
using namespace std;
enum C_Texture{
GRASS_TEXTURE,
HILL_TEXTURE,
RIVER_TEXTURE
};
class C_Terrain {
public:
C_Terrain(int movement_cost, bool is_water, C_Texture texture)
:movement_cost_(movement_cost), is_water_(is_water), texture_(texture) {}
int Movement_Cost() const { return movement_cost_; }
bool Is_Water() const { return is_water_; }
C_Texture Get_Texture() const { return texture_; }
private:
int movement_cost_;
bool is_water_;
C_Texture texture_;
};
class C_World {
public:
C_World()
:grass_terrain_(1, false, GRASS_TEXTURE),
hill_terrain_(3, false, HILL_TEXTURE),
river_terrain_(2, true, RIVER_TEXTURE) {}
void Generate_Terrain();
const C_Terrain& Get_Tile(int x, int y) { return *tiles_[x][y]; }
private:
static const int WIDTH = 3;
static const int HEIGHT = 3;
C_Terrain* tiles_[WIDTH][HEIGHT];
C_Terrain grass_terrain_;
C_Terrain hill_terrain_;
C_Terrain river_terrain_;
};
void C_World::Generate_Terrain() {
tiles_[0][0] = &hill_terrain_;
tiles_[0][1] = &hill_terrain_;
tiles_[0][2] = &hill_terrain_;
tiles_[1][1] = &grass_terrain_;
tiles_[1][1] = &grass_terrain_;
tiles_[1][2] = &grass_terrain_;
tiles_[2][0] = &river_terrain_;
tiles_[2][1] = &river_terrain_;
tiles_[2][2] = &river_terrain_;
}
int main()
{
C_World world;
int cost = world.Get_Tile(1, 2).Movement_Cost();
}