경량패턴은 메모리 최적화를 위한 패턴이다.
많은 객체를 생성해야할 때, 에를 들어, 나무 오브젝트를 생성할 때, texture와 model은 동일하지만 위치와 색 등을 바꿔 숲을 만들 수 있다. 이 때, 100개의 나무라면 텍스처와 모델도 100개가 생성되는데, 동일한 이 백개를 공유데이터 1개로 대체하여 메모리를 최적화하는 것이다.
이 때, texture, model 같은 공유되는 데이터를 내부상태라 하고, 위치, 값 등 달라지는 변수를 외부상태라 한다.
내부 상태는 모든 나무 객체가 참조하게끔 하고 외부상태만 설정하게끔 하면 된다.
타일도 마찬가지로 고유한 타일의 값, 텍스처, 이 타일위에서의 캐릭터 이동속도 등은 변하지않는다.
그렇지만 위치는 매번 다르다.
따라서 각 타일마다 객체를 하나씩 만들어두고, 타일마다 해당타입의 클래스를 참조하게 둔다.
그리고 draw할 때는 위치만 변경해서 같은 타입을 그린다.
using System;
using System.Collections.Generic;
// 경량 객체 - TreeType
public class TreeType
{
public string Species { get; private set; } // 나무의 종류 (예: 소나무, 단풍나무 등)
public string LeafColor { get; private set; } // 나무의 잎 색상
public TreeType(string species, string leafColor)
{
Species = species;
LeafColor = leafColor;
}
}
// TreeNode - 실제 나무 객체
public class TreeNode
{
public TreeType Type { get; private set; } // 경량 객체 참조 (나무의 종류와 색상)
public string Position { get; private set; } // 나무의 위치
public float Height { get; private set; } // 나무의 높이
public TreeNode(string position, float height, TreeType type)
{
Position = position;
Height = height;
Type = type;
}
// 트리 정보를 출력하는 메서드
public void Display()
{
Console.WriteLine($"Tree at {Position}: {Type.Species} with {Type.LeafColor} leaves, Height: {Height} meters");
}
}
// TreeType 객체를 관리하는 클래스 - TreeTypeFactory
public class TreeTypeFactory
{
private Dictionary<string, TreeType> treeTypes = new Dictionary<string, TreeType>();
// 주어진 종류와 색상에 대한 TreeType을 반환 (경량 객체)
public TreeType GetTreeType(string species, string leafColor)
{
string key = species + leafColor;
if (!treeTypes.ContainsKey(key))
{
// TreeType이 없으면 새로 생성
treeTypes[key] = new TreeType(species, leafColor);
}
return treeTypes[key];
}
}
public class Program
{
public static void Main()
{
// 경량 객체 관리 팩토리
TreeTypeFactory typeFactory = new TreeTypeFactory();
// 트리 노드 타입 생성 (경량 객체)
TreeType pineTree = typeFactory.GetTreeType("Pine", "Green");
TreeType mapleTree = typeFactory.GetTreeType("Maple", "Red");
// 트리 객체 생성 (각각 고유한 위치와 높이를 가지지만, 타입은 공유)
TreeNode tree1 = new TreeNode("Park", 5.0f, pineTree);
TreeNode tree2 = new TreeNode("Street", 3.5f, mapleTree);
TreeNode tree3 = new TreeNode("Garden", 7.2f, pineTree);
TreeNode tree4 = new TreeNode("Hill", 10.0f, mapleTree);
// 트리 정보 출력
tree1.Display();
tree2.Display();
tree3.Display();
tree4.Display();
}
}
이 처럼 하나의 공용 데이터클래스를 만들고 이를 참조하여 동일한 메모리가 낭비되지 않게 최적화하는 기법이 경량패턴이다.