-
유니티 쉽게 배우는 디자인 패턴 - 팩토리 패턴 / Unity Design Pattern - Factory Pattern유니티 2024. 8. 23. 00:03
팩토리 패턴이란?
객체 생성만을 담당하는 패턴입니다.
공장에서 물건을 찍어낼 때 주문을 넣으면 나오듯
string 또는 enum으로 생성하라고 호출하면 해당하는 객체를 생성해 반환해 줍니다.
장점으로는 객체를 생성할 때 매개변수의 구조가 바뀌면 모든 스크립트의 생성부분을 변경해줘야 하는데
이것을 생성을 담당하는 팩토리 클래스에서 처리하게 되면 일이 간단해집니다.
포톤 서버(https://doc.photonengine.com/ko-kr/server/current/plugins/manual)에서
플러그인 이름에 따라 다른 객체를 생성할 때 사용하고 있습니다.
팩토리 패턴은 게임오브젝트를 생성해 반환해 주는 경우 프리팹으로 대체할 수 있습니다.
심플 팩토리 패턴
Factory.cs
using UnityEngine; public class Factory : MonoBehaviour { [SerializeField] GameObject cubePrefab; [SerializeField] GameObject spherePrefab; public GameObject Create(string type) { switch (type) { case "Cube": return Instantiate(cubePrefab); case "Sphere": return Instantiate(spherePrefab); default: Debug.LogError($"{type} is null."); return null; } } }
Test.cs
using UnityEngine; public class Test : MonoBehaviour { [SerializeField] Factory factory; void Start() { factory.Create("Cube"); factory.Create("Sphere"); } }
심플 팩토리 패턴은 string이나 enum으로 분기하여 생성을 담당합니다.
이게 패턴인가 싶을 정도로 매우 간단합니다.
Factory에서 Cube와 Sphere를 각각 프리팹으로 만들어 인스펙터에 넣어줍니다.
Create를 호출할 때 string에 맞는 객체가 생성되어 반환됩니다.
Test는 Factory를 참조합니다.
팩토리 메서드 패턴
FactoryBase.cs
using UnityEngine; public abstract class FactoryBase : MonoBehaviour { public abstract GameObject Create(string type); }
RectangularFactory.cs
using UnityEngine; public class RectangularFactory : FactoryBase { [SerializeField] GameObject cubePrefab; [SerializeField] GameObject planePrefab; public override GameObject Create(string type) { switch (type) { case "Cube": return Instantiate(cubePrefab); case "Plane": return Instantiate(planePrefab); default: Debug.LogError($"{type} is null."); return null; } } }
SphericalFactory.cs
using UnityEngine; public class SphericalFactory : FactoryBase { [SerializeField] GameObject spherePrefab; [SerializeField] GameObject capsulePrefab; public override GameObject Create(string type) { switch (type) { case "Sphere": return Instantiate(spherePrefab); case "Capsule": return Instantiate(capsulePrefab); default: Debug.LogError($"{type} is null."); return null; } } }
Test.cs
using UnityEngine; public class Test : MonoBehaviour { [SerializeField] RectangularFactory rectangularFactory; [SerializeField] SphericalFactory sphericalFactory; void Start() { rectangularFactory.Create("Cube"); rectangularFactory.Create("Plane"); sphericalFactory.Create("Sphere"); sphericalFactory.Create("Capsule"); } }
팩토리 메서드 패턴은 그룹별로 분류하여 생성합니다.
마치 김 공장, 참치 공장이 분류된 것처럼요.
FactoryBase는 생성에만 관여하는 추상함수 Create를 만듭니다.
RectangularFactory는 사각형에 관련된 생성부분을 묶었으며 Cube와 Plane의 생성을 담당합니다.
인스펙터에서 Cube, Plane 프리팹을 만들어 넣어줍니다.
SphericalFactory는 구형에 관련된 생성부분을 묶었으며 Sphere과 Capsule의 생성을 담당합니다.
인스펙터에서 Sphere, Capsule 프리팹을 만들어 넣어줍니다.
Test는 RectangularFactory와 SphericalFactory를 참조합니다.
추상팩토리 패턴
FactoryBase.cs
using UnityEngine; public abstract class FactoryBase : MonoBehaviour { public abstract GameObject Create(string type); public void SetColor(GameObject obj, Color color) { obj.GetComponent<Renderer>().material.color = color; } }
Test.cs
using UnityEngine; public class Test : MonoBehaviour { [SerializeField] RectangularFactory rectangularFactory; [SerializeField] SphericalFactory sphericalFactory; void Start() { GameObject obj = rectangularFactory.Create("Cube"); rectangularFactory.SetColor(obj, Color.red); obj = rectangularFactory.Create("Plane"); rectangularFactory.SetColor(obj, Color.green); obj = sphericalFactory.Create("Sphere"); sphericalFactory.SetColor(obj, Color.blue); obj = sphericalFactory.Create("Capsule"); sphericalFactory.SetColor(obj, Color.black); } }
추상팩토리 패턴은 생성시 조합도 가능하게 합니다.
김 공장에서 참기름과 조합하면 참기름 김, 곱창과 조합하면 곱창 김처럼 말이죠.
RectangularFactory와 SphericalFactory는 팩토리 메서드와 동일합니다.
FactoryBase에 SetColor를 추가하여 색상을 바꾸도록 했습니다.
Test에는 색상도 바꿀 수 있게 합니다.
마무리
심플 팩토리 패턴은 간단하게 string이나 enum으로 분기하여 생성을 담당합니다.
팩토리 메서드 패턴은 그룹별로 묶어 생성을 담당합니다.
추상팩토리 패턴은 생성시 조합도 가능합니다.
팩토리 패턴은 사실 프리팹이 그 일을 대체할 수가 있기 때문에 팩토리패턴은 잘 안쓰이게 됩니다.
하지만 일반 클래스의 구조 설계시 적재적소에 맞는 곳에 사용하면 됩니다.
'유니티' 카테고리의 다른 글