• Tistory
    • 태그
    • 위치로그
    • 방명록
    • 관리자
    • 글쓰기
Carousel 01

[디자인패턴] 경량 패턴, 플라이웨이트 패턴 (Flyweight Pattern)

Programming/디자인패턴 2020. 7. 1. 18:00

◎ 정의

 

플라이웨이트 패턴(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
블로그 이미지

BlackTopaz

e-mail : vluebear@naver.com

,

카테고리

  • 분류 전체보기 (80)
    • Programming (3)
      • C# (0)
      • Unity (0)
      • 디자인패턴 (3)
    • 프로그래밍 문제 풀이 (75)
      • C# (49)
      • MySQL (26)
    • 개발 일지 (0)
      • Project_EDM (0)
    • 디버깅 & 오류 해결 로그 (2)
      • Unity (2)

태그목록

  • 프로그래머스
  • 유니티
  • Unity
  • 게임프로그래밍
  • C#
  • mysql
  • 디자인패턴
  • 유니티 에러
  • 프로그래밍 문제 풀이
  • Unity Error

글 보관함

달력

«   2026/02   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

링크

BlackTopaz

블로그 이미지

e-mail : vluebear@naver.com

LATEST FROM OUR BLOG

RSS 구독하기

LATEST COMMENTS

BLOG VISITORS

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015 Socialdev. All Rights Reserved.

티스토리툴바