Patrick's Devlog

[Unity] Factory Pattern 본문

Unity/Design Pattern

[Unity] Factory Pattern

Patrick_ 2024. 10. 1. 11:12

Factory Pattern

객체 생성을 위한 패턴이다. 아이템을 직접 생성하는 것이 아닌, 팩토리에서 호출하여 생성하는 것이 팩토리 패턴이다. 

객체 생성에 대한 인터페이스와 구현의 분리가 가능하고, 객체 생성과 관련된 많은 세부 정보를 캡슐화할 수 있다. 또한 새

로운 객체를 생성 방식에 대한 확장이 가능하다. 

Key-Value Dictionary를 이용한 탐색을 적용해, 아이템의 등급 등을 풀로 만들어 적용하는 경우가 많다. 또한 아이템을 많이 생성하다 보니 Object Pool과 병행해서 사용된다. 

 

아이템 생성을 위한 아이템 매니저를 제작한다고 가정하고 코드를 예시로 들어보자. 

public class ItemManager : MonoBehaviour {
    ...
    public void SpawnItem(ItemType type) {
        switch(type) {
            case ItemType.Health:
            ...
            case ItemType.Speed;
            ...
            case ItemType.Shield;
            ...
            case ItemType.Heart:
            ...
        }
    }
    
    ...
}

switch 문을 통해 아이템을 생성하게 되면 추후에 아이템이 추가될 때 아이템 매니저를 당연히 수정할 수 밖에 없게 된다. 이를 손대지 않고 개선하기 위해 팩토리 패턴을 적용한다.

public class ItemManager : MonoBehaviour {
    ItemFactory itemFactory;
    public void SpawnItem(ItemType type) {
        ...
        GameObject item = itemFactory.CreateItem(...);
        ...
    }
}

구체적인 아이템의 상황은 팩토리에 전달을 해주면 된다. 해당 코드는 아이템 매니저를 굳이 건들일 필요없이, 아이템만 추가하여 팩토리만 생성해주면 된다. 해당 코드 또한 추상화에 의존하고 있으며 개방 폐쇄 원칙을 지키게 되는 것이다. 

예시

구체적인 예시를 코드로 살펴보자. 우선 예시의 설계는 위의 그림과 같다. Factory는 IProduct만 의존하므로, 구체적인 클래스나 아이템에 의존하지 않고 추상화에 의존하므로 확장에 용이하다. 

public interface IProduct {
    public string Productname { get; set; }
    public void Initialize();
}

public abstract class Factory : MonoBehaviour { // 추상클래스 팩토리
    public abstract IProduct GetProduct(Vector3 pos); // 아이템을 돌려주는 메소드
    
}

public class ProductA : MonoBehaviour, IProduct { // IProduct 구체화
    ...
    public void Initialize() { ... }
 }
 
 // ---
 
 public class ConcreteFactoryA : Factory {
     [SerializeField] private ProductA productPrefab;
     
     public override IProduct GetProduct(Vector3 position) {
         GameObject instance = Instantiate(productPrefab.gameObject, ... ); // 생성
         ProductA newProduct = instance.GetComponent<ProductA>();
         newProduct.Initialize(); // 초기화
         return newProduct; // 반환
     }
 }

참고 문서

[유니티 TIPS] 객체 생성을 위한 Factory 패턴 | 프로그래밍 디자인패턴

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

[Unity] Singleton Pattern  (1) 2024.10.04
[Unity] Object Pool Pattern  (0) 2024.10.03
[Unity] Command Pattern  (0) 2024.09.30
[Unity] Observer Pattern  (0) 2024.09.27
[Unity] State Pattern  (1) 2024.09.26