Design Pattern

프로토타입 (Prototype)

coucou3 2020. 7. 19. 16:19
반응형

게임 프로그래밍 패턴 5장

프로토타입

 

 

프로토타입 패턴은 새로운 객체를 생성할 때 원형 객체를 복사하여 만드는 패턴이다.

복사할 원형 객체가 있고, 새로운 객체를 생성할 때 발생하는 비용이 매우 클 때 유용하다.

 

Unity에서 Prefab을 사용한 객체 생성 형식이 대표적인 프로토타입 패턴이다.

패턴은 clone() 메서드를 선언하는 추상 베이스 클래스와 이를 상속받아 다형적으로 clone()을 구현하는 하위 클래스로 이루어진다.

 

 

 

예를 들어 던전을 만드는데 층을 올라갈수록 등장 몬스터가 조금씩 바뀌는 상황이라고 해보자. 기본적인 데이터는 DB에서 가져온다.

이때 바뀌는 몬스터 목록을 얻기 위해 매번 DB에 접속하는 것은 앞서 얘기한 비용 낭비가 심한 방법이다.

처음 가져온 데이터를 원형으로 새로운 객체를 생성하는 프로토타입 패턴을 적용해보자.

 

# Monsters.cs

가장 먼저 Clone() 추상 메서드를 갖는 베이스 클래스를 만든다.

public abstract class Monsters
{
    public abstract Monsters Clone();
}

 

# DungeonMonsters.cs

Monsters를 상속받아 Clone 메서드를 구현하는 클래스

public class DungeonMonsters : Monsters
{
    public List<string> listMonsters;

    public DungeonMonsters()
    {
        listMonsters = new List<string>();
    }


    public DungeonMonsters(List<string> newList)
    {
        listMonsters = newList;
    }


    # DB에서 데이터를 가져오는 부분이라고 치자
    public void Initialize()
    {
        listMonsters.Add("Ogre");
        listMonsters.Add("Goblin");
        listMonsters.Add("Orc");
    }
    
    
    // Clone 메서드를 구현하는데, Deep Copy 방식으로 했다.
    public override Monsters Clone()
    {
        var listCopy = new List<string>();
        foreach (var monster in listMonsters)
        {
            if (monster != string.Empty)
                listCopy.Add(monster);
        }

        return new DungeonMonsters(listCopy);
    }
}

 

# MonsterLoader.cs

몬스터 정보를 불러오는 메인 클래스

using UnityEngine;

public class MonsterLoader : MonoBehaviour
{
    private void Start()
    {
        // 기본 몬스터 정보 
        var originalMonsters = new DungeonMonsters();
        originalMonsters.Initialize();

        // 2층 몬스터 정보
        var secondFloorMonsters = originalMonsters.Clone() as DungeonMonsters;
        if (secondFloorMonsters == null) return;
        
        secondFloorMonsters.listMonsters.Add("Undead");
        secondFloorMonsters.listMonsters.Add("Wolf");

        // 3층 몬스터 정보
        var thirdFloorMonsters = originalMonsters.Clone() as DungeonMonsters;
        if (thirdFloorMonsters == null) return;

        thirdFloorMonsters.listMonsters.Remove("Ogre");
        thirdFloorMonsters.listMonsters.Remove("Goblin");
        thirdFloorMonsters.listMonsters.Add("Dragon");


       Debug.Log("originalMonsters : " + string.Join(", ", originalMonsters.listMonsters));
       Debug.Log("secondFloorMonsters : " + string.Join(", ", secondFloorMonsters.listMonsters));
       Debug.Log("thirdFloorMonsters : " + string.Join(", ", thirdFloorMonsters.listMonsters));
    }
}

 

 

결과

반응형

'Design Pattern' 카테고리의 다른 글

싱글턴 (Singleton)  (0) 2020.09.19
관찰자 (Observer)  (0) 2020.07.05
경량 (Flyweight)  (0) 2020.06.24