IMCAT.DEV
로그인 가입
C# 고급 디자인패턴

C# 디자인 패턴(Factory, Singleton 등)

C# 디자인 패턴(Factory, Singleton 등) — 고급

디자인 패턴 (Factory, Singleton 등)

1. 도입 (왜 배워야 하는가)

디자인 패턴은 소프트웨어 설계에서 발생할 수 있는 문제를 해결하기 위한 일반적인 해결책을 제공합니다. 특히 C#과 같은 객체 지향 프로그래밍 언어에서 디자인 패턴을 적용하면 코드의 재사용성과 유지 보수성을 크게 향상시킬 수 있습니다. 실무에서는 팀원 간의 협업을 원활하게 하고, 코드의 가독성을 높이며, 버그 발생 확률을 줄이는 데 기여합니다.

디자인 패턴을 모르고 개발을 진행하면, 비효율적인 코드 구조를 만들거나 코드 중복이 발생할 수 있으며, 결과적으로 시스템의 복잡성이 증가하고 유지 보수가 어려워질 수 있습니다. 이는 프로젝트의 성격과 관계없이 모든 소프트웨어 개발에 해당됩니다.

2. 핵심 개념 설명

디자인 패턴의 몇 가지 주요 개념을 살펴보겠습니다.

1. Factory 패턴

  • 정의: 객체 생성 인터페이스를 정의하되, 어떤 클래스의 인스턴스를 생성할지는 서브클래스에서 결정하는 패턴입니다.
  • 비유: 공장에서 제품을 만들 때, 특정 제품의 세부 사항을 모르는 고객이 원하는 제품을 주문하는 것과 유사합니다. 고객은 단순히 제품의 유형만 알고, 공장이 이를 처리합니다.
  • 2. Singleton 패턴

  • 정의: 클래스의 인스턴스가 오직 하나만 존재하도록 보장하는 패턴입니다.
  • 비유: 단 하나의 지도책이 존재하는 도시를 생각해 보세요. 주민들은 이 지도책을 통해 길을 찾고, 여러 개의 지도책이 존재하면 혼란을 초래할 수 있습니다.
  • 패턴 이름목적사용 예시
    Factory객체 생성의 책임을 분리다양한 제품 인스턴스 생성
    Singleton단일 인스턴스 보장설정 관리 클래스

    3. 기본 코드 예제

    Factory 패턴

    public interface IProduct
    {
        string GetName();
    }
    
    public class ConcreteProductA : IProduct
    {
        public string GetName() => "Product A";
    }
    
    public class ConcreteProductB : IProduct
    {
        public string GetName() => "Product B";
    }
    
    public class ProductFactory
    {
        public IProduct CreateProduct(string type)
        {
            return type switch
            {
                "A" => new ConcreteProductA(),
                "B" => new ConcreteProductB(),
                _ => throw new ArgumentException("Invalid product type")
            };
        }
    }
    
    // 사용 예
    var factory = new ProductFactory();
    var productA = factory.CreateProduct("A");
    Console.WriteLine(productA.GetName()); // 실행 결과: Product A
  • IProduct 인터페이스와 두 개의 구체적인 제품 클래스가 있습니다.
  • ProductFactory 클래스는 요청된 제품 유형에 따라 적절한 인스턴스를 생성합니다.
  • CreateProduct 메서드는 제품 유형에 따라 적절한 객체를 반환합니다.
  • 4. 실전 활용 예제

    1. 쇼핑몰에서 장바구니 구현

    public interface ICartItem
    {
        decimal GetPrice();
    }
    
    public class Book : ICartItem
    {
        public decimal GetPrice() => 29.99m;
    }
    
    public class Electronics : ICartItem
    {
        public decimal GetPrice() => 199.99m;
    }
    
    public class CartFactory
    {
        public ICartItem CreateCartItem(string type)
        {
            return type switch
            {
                "Book" => new Book(),
                "Electronics" => new Electronics(),
                _ => throw new ArgumentException("Invalid item type")
            };
        }
    }
    
    // 사용 예
    var cartFactory = new CartFactory();
    var bookItem = cartFactory.CreateCartItem("Book");
    Console.WriteLine(bookItem.GetPrice()); // 실행 결과: 29.99

    2. 설정 관리 클래스 (Singleton)

    public class ConfigurationManager
    {
        private static ConfigurationManager _instance;
    
        private ConfigurationManager() { }
    
        public static ConfigurationManager Instance => _instance ??= new ConfigurationManager();
    
        public string GetSetting(string key) => "SomeValue"; // 설정값 반환
    }
    
    // 사용 예
    var config = ConfigurationManager.Instance;
    Console.WriteLine(config.GetSetting("SomeKey")); // 실행 결과: SomeValue

    5. 흔한 실수와 주의사항

  • Factory 패턴:
  • - 잘못된 코드:

        var product = factory.CreateProduct("C"); // 존재하지 않는 유형

    - 올바른 코드:

        var product = factory.CreateProduct("A"); // 존재하는 유형
  • Singleton 패턴:
  • - 잘못된 코드:

        var instance1 = new ConfigurationManager(); // 인스턴스를 직접 생성
        var instance2 = new ConfigurationManager();

    - 올바른 코드:

        var instance1 = ConfigurationManager.Instance; // 싱글톤 인스턴스 사용
        var instance2 = ConfigurationManager.Instance;

    6. 정리

  • 디자인 패턴은 소프트웨어 개발에서 필수적인 도구입니다.
  • Factory 패턴은 객체 생성을 효율적으로 관리하고, Singleton 패턴은 인스턴스 관리를 단순화합니다.
  • 이러한 패턴을 통해 코드의 재사용성과 유지 보수성을 높일 수 있습니다.
  • 다음에 학습하면 좋은 주제:

  • Observer 패턴
  • Strategy 패턴
  • Decorator 패턴