Unity/Unity 디자인 패턴

[Unity 디자인 패턴] 심플 팩토리 패턴(Simple Factory Pattern)

ForMan_ 2024. 4. 25. 00:08

[ 참고사이트 ]

https://ansohxxn.github.io/design%20pattern/chapter4/

 

Chapter 4. 심플 팩토리 패턴(Simple Factory Pattern)

인프런에 있는 이재환님의 강의 게임 디자인 패턴 with Unity 를 듣고 정리한 필기입니다. 😀

ansohxxn.github.io


[ 서론 ]

컴포넌트, 싱글톤 패턴은 실제로 제가 프로젝트를 만들면서 사용한 적이 있지만 팩토리 패턴은 단 한 번도 사용한 적이 없습니다. 상속을 사용하긴 했지만 팩토리 패턴과 같은 공장과 같은 구조의 디자인 패턴을 구현한 적은 없어서 이렇게 공부하고 정리해봅니다.


1. 팩토리 패턴

  • 팩토리: 객체 생성을 처리하는 클래스.
  • 팩토리 패턴: 객체를 생성하고자 할 때 사용하는 패턴.

  • 팩토리 패턴은 객체를 생성하기 위한 인터페이스를 제공, 실제 생성 로직은 이를 구현한 하위 클래스에서 결정.

2. 왜 사용할까?

  • 객체 생성과 사용이 분리됨.
    => 코드의 유연성과 확장성이 향상.
  • 유연성
    => 팩토리 매서드 패턴과 추상 팩토리 패턴을 사용하면 객체 생성 로직을 변경하거나 다른 종류의 객체를 생성하는 것이 쉬워짐.  (= 유지보수에 좋음)
  • 코드 중복 최소화
    => 객체 생성 로직이 여러 곳에서 반복되지 않고 하나의 장소에 집중되기 때문에 코드 중복을 최소화할 수 있음.
    => 코드의 일관성과 가독성 향상.

3. 심플 팩토리 패턴

  • 팩토리 패턴 중 가장 기본적인 구조.
  • 하나의 팩토리 클래스가 객체를 생성하는 방식.
  • 여러개의 자식 오브젝트들을 하나의 함수로 한방에 생성하기 위해 사용하는 패턴.

4. 구현

  • 단순히 자동차를 만드는 공장 구조를 만들겁니다.
  • 자동차의 종류는 일단 세단과 트럭만 있습니다.  

[ Car.cs ] - 어떠한 자동차든 출차되면 바로 이동을 하게 하는 추상클래스를 사용.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 자동차가 출차 후 이동하는 함수정의를 가진 추상클래스.
public abstract class Car
{
    public abstract void Move();
}

// Sedan클래스(Car 상속)
public class Sedan : Car
{
    public Sedan()
    {
        Debug.Log("Sedan 출차");
    }

    public override void Move()
    {
        Debug.Log("Sedan 이동");
    }
}

// Truck클래스(Car 상속)
public class Truck : Car
{
    public Truck()
    {
        Debug.Log("Truck 출차");
    }

    public override void Move()
    {
        Debug.Log("Truck 이동");
    }
}

 

[ CarFactory.cs ] - 자동차 타입에 따른 객체 생성.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 자동차 타입.
public enum CarType
{
    Sedan = 0,
    Truck = 1
}

// 자동차 생산 공장 클래스.
public class CarFactory : MonoBehaviour
{
    public static Car createCar(CarType type)
    {
        Car car = null;

		// 자동차 타입에 따라 해당 자동차 종류 클래스 인스턴스.
        switch (type)
        {
            case CarType.Sedan:
                car = new Sedan();
                break;
            case CarType.Truck:
                car = new Truck();
                break;
        }

        return car;
    }

	// 버튼을 누르면 해당 자동차 출차 및 이동.
    public void OnClick_BtnCreatCar(int numCartype)
    {
        CarType type = (CarType)numCartype;
        createCar(type).Move();
    }
}