프로그래밍/C#

소프트웨어 설계의 핵심: 팩토리 패턴의 이해와 활용

shimdh 2025. 9. 17. 10:12
728x90

소프트웨어 개발에서 디자인 패턴은 자주 발생하는 문제에 대한 검증된 해결책을 제공합니다. 그 중에서도 팩토리 패턴은 객체 생성의 복잡성을 줄이고 코드의 유연성을 높이는 데 중요한 역할을 합니다. 이번 블로그에서는 팩토리 패턴의 개념, 구성 요소, 실용적인 예시, 그리고 장점에 대해 깊이 있게 살펴보겠습니다.

팩토리 패턴이란?

팩토리 패턴은 생성 패턴의 한 종류로, 클래스가 생성해야 할 객체의 유형을 예측할 수 없을 때 사용됩니다. 객체를 직접 인스턴스화하는 대신, 팩토리 메서드나 클래스가 특정 매개변수나 조건에 따라 객체 생성을 처리합니다. 이 접근 방식은 느슨한 결합을 촉진하고, 기존 코드를 수정하지 않고 시스템을 확장할 수 있도록 하는 개방/폐쇄 원칙을 준수합니다.

주요 개념

  • 캡슐화: 팩토리 패턴은 인스턴스화 로직을 별도의 클래스나 메서드로 캡슐화합니다.
  • 디커플링: 클라이언트 코드를 인스턴스화해야 하는 특정 클래스와 분리합니다.
  • 유연성: 새로운 제품 유형을 클라이언트 코드의 최소한의 변경으로 도입할 수 있습니다.

팩토리 패턴의 구성 요소

  1. 제품 인터페이스: 팩토리가 생성하는 모든 제품에 대한 공통 인터페이스.
  2. 구체적인 제품: 제품 인터페이스를 구현하는 클래스들.
  3. 팩토리 클래스/메서드: 입력 매개변수에 따라 구체적인 제품 인스턴스를 생성하는 역할을 담당합니다.
728x90

실용적인 예시

다양한 유형의 차량(예: 자동차, 트럭)을 팩토리 패턴을 사용하여 생성하는 예를 고려해 봅시다:

// 1단계: 제품 인터페이스 정의
public interface IVehicle
{
    void Drive();
}

// 2단계: 구체적인 제품 생성
public class Car : IVehicle
{
    public void Drive()
    {
        Console.WriteLine("Driving a car!");
    }
}

public class Truck : IVehicle
{
    public void Drive()
    {
        Console.WriteLine("Driving a truck!");
    }
}

// 3단계: 차량 팩토리 생성
public static class VehicleFactory
{
    public static IVehicle GetVehicle(string vehicleType)
    {
        switch (vehicleType.ToLower())
        {
            case "car":
                return new Car();
            case "truck":
                return new Truck();
            default:
                throw new ArgumentException("Invalid vehicle type");
        }
    }
}

이제 애플리케이션에서 이 팩토리를 사용할 수 있습니다:

class Program 
{
   static void Main(string[] args) 
   {
       // 구체적인 클래스에 대한 정보를 알지 않고 VehicleFactory를 사용하여 객체 생성.
       IVehicle myCar = VehicleFactory.GetVehicle("car");
       myCar.Drive(); // 출력: Driving a car!

       IVehicle myTruck = VehicleFactory.GetVehicle("truck");
       myTruck.Drive(); // 출력: Driving a truck!
   }
}

장점

  • 코드 유지보수: 구체적인 제품 클래스에서 변경이 발생해도 동일한 인터페이스를 준수하는 한 클라이언트 코드에 영향을 미치지 않습니다.
  • 확장성: 새로운 제품 유형을 추가할 때는 새로운 클래스를 추가하고 필요시 팩토리 메서드를 업데이트하는 것만으로 충분하며, 기존 로직을 변경할 필요가 없습니다.

팩토리 패턴을 사용할 때

  1. 인터페이스의 여러 구현이 시간이 지남에 따라 변경될 수 있는 경우.
  2. 시스템 아키텍처가 유연하고 기존 구성 요소를 크게 변경하지 않고 쉽게 확장되기를 원하는 경우.

팩토리 패턴을 효과적으로 활용함으로써 개발자는 더 깨끗한 아키텍처를 보장하고, 관심사의 분리 및 SOLID 원칙 준수와 같은 더 나은 관행을 촉진할 수 있습니다. 이를 통해 C# 애플리케이션을 시간이 지나도 견고하고 적응 가능하게 만들 수 있습니다.

728x90