팩토리 패턴(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();
}
}
'게임개발 > 스터디' 카테고리의 다른 글
[스터디] 인터페이스 vs 추상 클래스 차이 (0) | 2024.05.12 |
---|---|
[스터디] UI관련 최적화 한 것 (0) | 2024.05.12 |
[스터디] 부동소수점 오차가 나는 이유 (0) | 2024.05.11 |
[스터디] 개발 시 편의 기능 (0) | 2024.05.07 |
[스터디] ref/out 차이 (0) | 2024.05.07 |