728x90
🏆 목차.
🛒 서론
팩토리 패턴(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
'프로그래밍 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 옵저버 패턴(Observer Pattern) (0) | 2024.06.22 |
---|---|
[디자인패턴] 상태 패턴(State Pattern) (0) | 2024.06.21 |