게임개발/스터디

[스터디] 팩토리 패턴이란?

감물 2024. 5. 12. 15:41

팩토리 패턴(Factory Pattern)은 객체 생성을 캡슐화하는 디자인 패턴 중 하나이다. 이 패턴은 객체의 생성과정을 클라이언트 코드로부터 분리함으로써, 클라이언트가 특정 클래스의 인스턴스를 직접 생성하지 않고도 필요한 객체를 얻을 수 있게 해준다.

 

 

* 특징

1. 추상화 : 객체 생성 로직을 특정 인터페이스 또는 추상 클래스 뒤에 숨겨, 실제 생성되는 객체의 구체적인 클래스를 클라이언트로부터 숨긴다.

2. 유연성 : 새로운 클래스를 추가하거나 기존 클래스를 변경할 때 클라이언트 코드의 변경 없이도 객체의 생성을 관리할 수 있다.

3. 재사용성 : 생성 로직을 한 곳에 모아 두어 코드 중복을 줄이고, 유지보수를 용이하게 한다.

 

 

* 팩토리 패턴의 종류

1. 단순 팩토리 패턴(Simple Factoroy) : 객체 생성을 위한 메서드를 제공하여 클라이언트가 요구하는 객체를 반환한다.

public abstract class EnemyFactory
{
    public abstract Enemy CreateEnemy(string type);
}

public class SimpleEnemyFactory : EnemyFactory
{
    public override Enemy CreateEnemy(string type)
    {
        switch (type)
        {
            case "Zombie":
                return new Zombie();
            case "Vampire":
                return new Vampire();
            default:
                throw new ArgumentException("Invalid enemy type");
        }
    }
}

 

 

 

2. 팩토리 메서드 패턴(Factory Method) : 객체 생성을 위한 인터페이스를 정의하고, 하위 클래스가 어떤 클래스의 인스터스를 생성할지 결정하게 한다.

using UnityEngine;

public abstract class Enemy : MonoBehaviour
{
    public abstract void Attack();
}

public class Zombie : Enemy
{
    public override void Attack()
    {
        Debug.Log("Zombie attacks!");
    }
}

public class Goblin : Enemy
{
    public override void Attack()
    {
        Debug.Log("Goblin attacks!");
    }
}
public abstract class EnemyFactory
{
    public abstract Enemy CreateEnemy();
}

public class ZombieFactory : EnemyFactory
{
    public override Enemy CreateEnemy()
    {
        return new GameObject("Zombie").AddComponent<Zombie>();
    }
}

public class GoblinFactory : EnemyFactory
{
    public override Enemy CreateEnemy()
    {
        return new GameObject("Goblin").AddComponent<Goblin>();
    }
}
public class Game
{
    void Start()
    {
        EnemyFactory factory = new ZombieFactory();
        Enemy zombie = factory.CreateEnemy();
        zombie.Attack();

        factory = new GoblinFactory();
        Enemy goblin = factory.CreateEnemy();
        goblin.Attack();
    }
}

 

 

 

3. 추상 팩토리 패턴(Abstract Factory) : 관련된 객체들의 집합을 생성하기 위한 인터페이스를 제공하며, 각 집합마다 서로 다른 실체를 구현한다.

using UnityEngine;

public abstract class Enemy : MonoBehaviour
{
    public abstract void Attack();
}

public class Zombie : Enemy
{
    public override void Attack()
    {
        Debug.Log("Zombie attacks with hands!");
    }
}

public class Skeleton : Enemy
{
    public override void Attack()
    {
        Debug.Log("Skeleton attacks with bow!");
    }
}

public class Goblin : Enemy
{
    public override void Attack()
    {
        Debug.Log("Goblin attacks with sword!");
    }
}

public class Orc : Enemy
{
    public override void Attack()
    {
        Debug.Log("Orc attacks with axe!");
    }
}
public abstract class EnemyFactory
{
    public abstract Enemy CreateRangedEnemy();
    public abstract Enemy CreateMeleeEnemy();
}

public class UndeadFactory : EnemyFactory
{
    public override Enemy CreateRangedEnemy()
    {
        return new GameObject("Skeleton").AddComponent<Skeleton>();
    }

    public override Enemy CreateMeleeEnemy()
    {
        return new GameObject("Zombie").AddComponent<Zombie>();
    }
}

public class GoblinoidFactory : EnemyFactory
{
    public override Enemy CreateRangedEnemy()
    {
        return new GameObject("Orc").AddComponent<Orc>();
    }

    public override Enemy CreateMeleeEnemy()
    {
        return new GameObject("Goblin").AddComponent<Goblin>();
    }
}
public class Game
{
    void Start()
    {
        EnemyFactory factory = new UndeadFactory();
        Enemy skeleton = factory.CreateRangedEnemy();
        skeleton.Attack();

        Enemy zombie = factory.CreateMeleeEnemy();
        zombie.Attack();

        factory = new GoblinoidFactory();
        Enemy orc = factory.CreateRangedEnemy();
        orc.Attack();

        Enemy goblin = factory.CreateMeleeEnemy();
        goblin.Attack();
    }
}