바로 저번 포스팅에 팩토리패턴에 대해서 글을 써봤습니다.
오늘은 저번 시간에 이어 조금 더 나아간 추상 팩토리에 대해서 알아보겠습니다.
기본 팩토리 패턴과 추상 팩토리 패턴의 차이
기본 팩토리 패턴(Factory Method)과 추상 팩토리 패턴(Abstract Factory)은 모두 객체 생성과 관련된 디자인 패턴이지만, 사용하는 방식과 목적에서 차이가 있습니다. 각각의 패턴은 객체를 생성하는 역할을 담당하지만, 추상화의 수준과 용도가 다릅니다.
기본 팩토리 메서드는 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴입니다
추상 팩토리는 관련 객체들의 구상 클래스들을 지정하지 않고도 관련 객체들의 모음을 생성할 수 있도록 하는 생성패턴입니다.
특징 | Factory Method 패턴 | Abstract Factory 패턴 |
주요 목적 | 단일 객체 생성 | 관련된 여러 객체 그룹을 일관성 있게 생성 |
사용 상황 | 구체적인 클래스에 의존하지 않고 하나의 객체만 생성할 때 | 관련 객체들이 함께 사용되며 일관된 조합이 필요할 때 |
구현 방식 | 하나의 객체 생성 메서드를 서브클래스에서 구현 | 여러 객체 생성 메서드를 포함한 팩토리를 정의 |
확장성 | 객체의 종류가 늘어나면 새로운 팩토리 서브클래스를 추가 | 관련된 객체 그룹에 대한 팩토리를 추가하여 확장 가능 |
예시 | 단일 적(enemy) 캐릭터 생성 | 캐릭터와 무기를 함께 생성 (예: 전사와 검) |
Factory Method Pattern 패턴 예제
// IEnemy 인터페이스 정의 - 모든 적의 기본 메서드를 정의
public interface IEnemy
{
void Attack();
}
// Goblin 클래스 정의 - Goblin의 공격 방식을 정의
public class Goblin : IEnemy
{
public void Attack()
{
Debug.Log("Goblin attacks with a dagger!");
}
}
// Orc 클래스 정의 - Orc의 공격 방식을 정의
public class Orc : IEnemy
{
public void Attack()
{
Debug.Log("Orc attacks with a club!");
}
}
// EnemyFactory 추상 클래스 - 팩토리 메서드를 정의
public abstract class EnemyFactory
{
public abstract IEnemy CreateEnemy();
}
// GoblinFactory 클래스 - Goblin을 생성하는 팩토리 클래스
public class GoblinFactory : EnemyFactory
{
public override IEnemy CreateEnemy()
{
return new Goblin();
}
}
// OrcFactory 클래스 - Orc를 생성하는 팩토리 클래스
public class OrcFactory : EnemyFactory
{
public override IEnemy CreateEnemy()
{
return new Orc();
}
}
// GameManager에서 팩토리 메서드 패턴을 사용하여 적 생성
public class GameManager : MonoBehaviour
{
private void Start()
{
EnemyFactory goblinFactory = new GoblinFactory();
IEnemy goblin = goblinFactory.CreateEnemy();
goblin.Attack(); // "Goblin attacks with a dagger!" 출력
EnemyFactory orcFactory = new OrcFactory();
IEnemy orc = orcFactory.CreateEnemy();
orc.Attack(); // "Orc attacks with a club!" 출력
}
}
Abstract Factory 패턴 예제
// ICharacter 인터페이스 정의 - 모든 캐릭터가 구현할 메서드 정의
public interface ICharacter
{
void Attack();
}
// IWeapon 인터페이스 정의 - 모든 무기가 구현할 메서드 정의
public interface IWeapon
{
void Use();
}
// Knight 클래스 정의 - Knight는 Sword를 사용
public class Knight : ICharacter
{
private IWeapon weapon;
public Knight(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack()
{
Debug.Log("Knight attacks with weapon!");
weapon.Use();
}
}
// Archer 클래스 정의 - Archer는 Bow를 사용
public class Archer : ICharacter
{
private IWeapon weapon;
public Archer(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack()
{
Debug.Log("Archer attacks with weapon!");
weapon.Use();
}
}
// Sword 클래스 정의 - Sword의 Use 메서드 구현
public class Sword : IWeapon
{
public void Use()
{
Debug.Log("Swinging the sword!");
}
}
// Bow 클래스 정의 - Bow의 Use 메서드 구현
public class Bow : IWeapon
{
public void Use()
{
Debug.Log("Shooting an arrow!");
}
}
// 추상 팩토리 인터페이스 정의
public interface ICharacterFactory
{
ICharacter CreateCharacter();
IWeapon CreateWeapon();
}
// KnightFactory 클래스 - Knight와 Sword를 생성하는 팩토리
public class KnightFactory : ICharacterFactory
{
public ICharacter CreateCharacter()
{
return new Knight(CreateWeapon());
}
public IWeapon CreateWeapon()
{
return new Sword();
}
}
// ArcherFactory 클래스 - Archer와 Bow를 생성하는 팩토리
public class ArcherFactory : ICharacterFactory
{
public ICharacter CreateCharacter()
{
return new Archer(CreateWeapon());
}
public IWeapon CreateWeapon()
{
return new Bow();
}
}
// GameManager에서 추상 팩토리 패턴 사용
public class GameManager : MonoBehaviour
{
private void Start()
{
ICharacterFactory knightFactory = new KnightFactory();
ICharacter knight = knightFactory.CreateCharacter();
knight.Attack(); // "Knight attacks with weapon!"과 "Swinging the sword!" 출력
ICharacterFactory archerFactory = new ArcherFactory();
ICharacter archer = archerFactory.CreateCharacter();
archer.Attack(); // "Archer attacks with weapon!"과 "Shooting an arrow!" 출력
}
}