[C#] Abstract Factory Pattern

Lingtea_luv·2025년 4월 5일
0

C#

목록 보기
25/37
post-thumbnail

추상 팩토리 패턴


서로 관련이 있는 객체들을 묶어서 팩토리 클래스로 만들고, 조건에 맞는 팩토리들을 사용하여 인스턴스를 생성하는 패턴

개념

추상 팩토리는 여러 팩토리 클래스에서 반드시 구현해야할 메서드를 모아놓은 것이다.

이는 추상 클래스와 쓰임이 동일한데, 팩토리가 많아져 관리의 필요성이 생길 때 추상 팩토리를 선언하여 관리를 하면 실수를 미연에 방지할 수 있다.

예시

난이도마다 동일 종의 몬스터를 차별화해야한다고 가정해보자.

예를 들어 보통 난이도에서는 보통 슬라임과 보통 고블린이 등장하고 하드 난이도에서는 하드 슬라임과 하드 고블린이 등장한다면, 우리는 난이도가 동일한 몬스터를 묶어 하나의 팩토리 클래스에서 생성을 관리할 수 있을 것이다.

하지만 난이도가 많아질수록 생성해야하는 팩토리가 많아질 것이고, 이들을 관리해야할 필요성이 생긴다.

구현

public abstract class Factory
{
	public abstract Slime CreateSlime();
    public abstract Goblin CreateGoblin();
}

public class EasyFactory : Factory
{
	public override Slime CreateSlime()
    {
    	return new EasySlime();
    }
    
    public override Goblin CreateGoblin() 
    {
    	return new EasyGoblin();
    }
}

public class HardFactory : Factory
{
	public override Slime CreateSlime()
    {
    	return new HardSlime();
    }
    
    public override Goblin CreateGoblin() 
    {
    	return new HardGoblin();
    }
}

public abstract class Slime
{
	public abstract void Skill();
}

public class EasySlime : Slime
{
	public override void Skill()
    {
    	// easy slime skill;
    }
}

public class HardSlime : Slime
{
	public override void Skill()
    {
    	// Hard slime skill;
    }
}

public abstract class Goblin
{
	public abstract void Skill();
}

public class EasyGoblin : Goblin
{
	public override void Skill()
    {
    	// easy goblin skill;
    }
}

public class HardGoblin : Goblin
{
	public override void Skill()
    {
    	// Hard goblin skill;
    }
}

이렇게 난이도에 따라 팩토리 클래스로 묶고, 이들을 추상 팩토리로 관리하게되면

public static Factory CreateFact(string level)
{
    if (level == "하드")
    {
        return new HardFactory();
    }
    else if (level == "보통")
    {
        return new EasyFactory();
    }
    else return null;
}

static void Main(string[] args)
{
    string level = "하드";

    Factory factory = CreateFact(level);

    Slime slime1 = factory.CreateSlime();
    Goblin goblin1 = factory.CreateGoblin();
    
    slime1.Skill();
    goblin1.Skill();
}
하드 슬라임 스킬
하드 고블린 스킬

위처럼 메인 메서드에서 동일한 생성자를 통해 생성을 해도 난이도에 맞는 몬스터들이 나오는 것을 확인할 수 있다.

장단점

장점

  1. 인스턴스 생성 부분에서 완전한 개방폐쇄원칙 적용
    몬스터가 추가되는 경우 추상 팩토리에 한 줄 추가함으로써 확장이 가능하다.

  2. 같은 팩토리에서 생산되는 객체간 호환을 보장
    동일한 난이도로 묶어 하나의 팩토리로 관리하기에 동일한 난이도의 몬스터가 보장된다.

단점

  1. 새로운 클래스 도입으로 인한 코드의 복잡성 증가
    위의 코드만 보더라도, 별 특별한 기능이 없음에도 코드가 굉장히 길다.
profile
뚠뚠뚠뚠

0개의 댓글