728x90

🏆 목차.

  1. 서론
  2. 본론
  3. 결론

 

🛒 서론

팩토리 패턴(Factory Pattern)

팩토리 패턴은 객체 생성 로직을 별도의 클래스로 분리하여 캡슐화하는 디자인 패턴입니다. 이를 통해 객체 생성의 책임을 분리하고, 객체 생성 과정을 더 유연하고 확장 가능하게 만들 수 있습니다. 팩토리 패턴은 주로 객체 생성의 복잡성을 줄이고, 코드의 재사용성을 높이며, 유지보수를 용이하게 하기 위해 사용됩니다.

 

🎨 본론

 

이론으로만 설명하면 이해가 어렵기 때문에 예시 코드를 통해 설명드리겠습니다.

 

팩토리 미사용)

public abstract class Item
{
    public abstract string Name { get; }
}

public class Sword : Item
{
    public override string Name => "Sword";
}

public class Shield : Item
{
    public override string Name => "Shield";
}

public class Game
{
    public Item CreateItem(string itemType)
    {
        if (itemType == "Sword")
        {
            return new Sword();
        }
        else if (itemType == "Shield")
        {
            return new Shield();
        }
        else
        {
            throw new ArgumentException("없는 아이템 타입입니다.");
        }
    }
}
public class Program
{
    public static void Main()
    {
        Game game = new Game();

        Item sword = game.CreateItem("Sword");
        Console.WriteLine($"Created item: {sword.Name}");

        Item shield = game.CreateItem("Shield");
        Console.WriteLine($"Created item: {shield.Name}");
    }
}

 

위 코드의 경우 Game 클래스가 아이템의 구체적인 생성 방식을 알고 있으며, 이는 객체 생성 로직이 분산되고 코드가 더 복잡해질 수 있다는 단점이 있습니다.

 

팩토리 사용) 

Item 클래스는 위와 동일합니다

public interface IItemFactory
{
    Item CreateItem();
}

public class SwordFactory : IItemFactory
{
    public Item CreateItem()
    {
        return new Sword();
    }
}

public class ShieldFactory : IItemFactory
{
    public Item CreateItem()
    {
        return new Shield();
    }
}
public class Game
{
    private readonly Dictionary<string, IItemFactory> _factories;

    public Game()
    {
        _factories = new Dictionary<string, IItemFactory>
        {
            { "Sword", new SwordFactory() },
            { "Shield", new ShieldFactory() }
        };
    }

    public Item CreateItem(string itemType)
    {
        if (_factories.ContainsKey(itemType))
        {
            return _factories[itemType].CreateItem();
        }
        else
        {
            throw new ArgumentException("없는 아이템 타입입니다.");
        }
    }
}
public class Program
{
    public static void Main()
    {
        Game game = new Game();

        Item sword = game.CreateItem("Sword");
        Console.WriteLine($"Created item: {sword.Name}");

        Item shield = game.CreateItem("Shield");
        Console.WriteLine($"Created item: {shield.Name}");
    }
}

 

두 코드를 비교해보겠습니다.

 

 

1. 객체 생성 책임 분리

  • 팩토리 x : Game 클래스가 아이템 생성 로직을 직접 처리하고 있어 클래스가 커지고 복잡해질 수 있습니다.
  • 팩토리 o : 객체 생성 책임이 IItemFactory 인터페이스와 그 구현 클래스들로 분리되어 있습니다. 결과적으로 코드의 응집도를 높이고, Game 클래스가 더 간결해집니다.

2. 확장성

  • 팩토리 x : 새로운 아이템 타입을 추가할 때마다 Game 클래스의 CreateItem 메서드를 수정해야 합니다.
  • 팩토리 o : 새로운 아이템 타입을 추가할 때는 새로운 팩토리 클래스를 추가하고, Game 클래스의 팩토리 딕셔너리에 해당 팩토리를 등록하기만 하면 됩니다. 기존 코드 수정이 최소화됩니다. 

3. 유지보수성 

  • 팩토리 x : 코드의 한 부분에서 문제가 생기면, 다른 부분에 영향을 미칠 가능성이 높습니다.
  • 팩토리 o  : 팩토리 클래스들이 독립적이기 때문에, 특정 아이템의 생성 로직을 변경하더라도 다른 부분에 영향을 주지 않습니다.

 

 

🎯 결론

 

팩토리 패턴을 사용하면 객체 생성 로직을 별도로 분리하여 코드의 가독성과 유지보수성을 높일 수 있습니다. 또한, 새로운 객체를 추가할 때 기존 코드를 최소한으로 수정하고 확장할 수 있어 유연성이 크게 향상됩니다. 이와 같은 이유로 팩토리 패턴은 소프트웨어 설계에서 자주 사용되는 유용한 패턴입니다.

728x90

+ Recent posts