◎ 정의
플라이웨이트 패턴(Flyweight pattern)는 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 소프트웨어 디자인 패턴이다. 종종 오브젝트의 일부 상태 정보는 공유될 수 있는데, 플라이웨이트 패턴에서는 이와 같은 상태 정보를 외부 자료 구조에 저장하여 플라이웨이트 오브젝트가 잠깐 동안 사용할 수 있도록 전달한다. - 출처 : 위키백과 |
- 이름에서 알 수 있듯이 경량 패턴은 수많은 객체를 렌더링 해야 하는 상황에서 각 객체 간에 서로 공유할 수 있는 자원이 있을 때 해당
공유 자원을 다른 객체에서 공유하게 만들어 메모리 사용량을 줄일 수 있도록 구현한 디자인패턴이다.
◎ 활용
- 게임에서 숲이나 유닛, 지형, 자잘한 환경 오브젝트 등 서로 비슷한 요소를 가지면서 많은 객체를 필요로 할 때 해당 리소스의 최적화
◎ 장점 / 단점
○ 장점
- 공통적인 속성을 갖는 많은 객체를 생성할 때 메모리를 아낄 수 있다.
○ 단점
- 데이터를 서로 공유하여 사용하도록 구현되었기 때문에 해당 패턴에 포함된 객체들 중에서 일부만 다른 식으로 동작하도록 구현하기에는 제약이 따른다.
◎ 코드 구현
< Missile.cs >
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Missile : MonoBehaviour
{
string missile_name;
int explosion_power;
int fire_range;
int fire_speed;
public Missile(string name)
{
missile_name = name;
}
public void SetPower(int power)
{
explosion_power = power;
}
public void SetRange(int range)
{
fire_range = range;
}
public void SetSpeed(int speed)
{
fire_speed = speed;
}
public void LaunchMissile()
{
Debug.Log("미사일이 발사되었습니다.");
}
}
- 생성할 미사일에 대한 정보를 저장하는 클래스
< MissileFactory.cs >
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MissileFactory : MonoBehaviour
{
// 미사일에 대한 정보를 담을 딕셔너리
Dictionary<string, Missile> missile_dic = new Dictionary<string, Missile>();
public Missile GetMissile(string name)
{
// 현재 name key 값으로 검색된 객체가 없다면 새로 생성하여 딕셔너리 추가
if (missile_dic.ContainsKey(name) == false)
{
Missile missile = new Missile(name);
missile_dic.Add(name, missile);
}
return missile_dic[name];
}
}
- Dictionary에 미사일의 이름을 key값으로 객체를 저장한다. 후에 다른 미사일 객체가 생성될 때 GetMissile()에서
key값으로 해당 객체에 대한 데이터가 있는지 검사하고 있을 경우 이미 저장된 데이터를 반환한다.
< BattleField.cs >
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Battlefield : MonoBehaviour
{
private void Start()
{
MissileFactory factory = new MissileFactory();
string[] missile_types = {"A_Missile", "B_Missile" , "C_Missile" , "D_Missile" };
for(int i = 0; i < 30; ++i)
{
Missile missile = factory.GetMissile(missile_types[Random.Range(0, 3)]);
missile.SetPower(Random.Range(1, 10));
missile.SetRange(Random.Range(100, 500));
missile.SetSpeed(Random.Range(500, 1000));
}
}
}
- 새로운 미사일 30개를 생성하는 코드이다. MissileFactory.cs의 GetMissile()를 통해 name으로 key를 검사하여
데이터가 있는지 검사 후 공유된 리소스로 생성하여 메모리의 낭비를 줄인다.
'Programming > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 관찰자 패턴 (Observer Pattern) (0) | 2020.07.02 |
---|---|
[디자인패턴] 명령 패턴, 커맨드 패턴 (Command Pattern) (0) | 2020.06.30 |