본문 바로가기
프로그래밍

C# 디자인 패턴 : 싱글톤 패턴과 팩토리 패턴 (Singleton & Factory Pattern)

by 이음코드 2024. 12. 3.
반응형

디자인 패턴은 소프트웨어 개발에서 자주 마주치는 문제들을 해결하기 위한 최적의 방법론입니다. 특히 C#에서의 디자인 패턴은 코드의 유지보수성, 재사용성을 높여줍니다. 이번 글에서는 그 중에서도 가장 많이 사용되는 두 가지 패턴인 싱글톤 패턴(Singleton Pattern)과 팩토리 패턴(Factory Pattern) 에 대해 알아보겠습니다.

 

1. 싱글톤 패턴 (Singleton Pattern)

1)  싱글톤 패턴이란?

싱글톤 패턴은 애플리케이션 내에서 특정 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 디자인 패턴입니다. 이 패턴은 주로 전역 상태를 유지해야 하거나, 어떤 작업에 대해 하나의 인스턴스만 필요할 때 사용됩니다. 예를 들어, 데이터베이스 연결 객체나 설정 값을 관리하는 클래스에 유용합니다.

 

2) 싱글톤 패턴의 구현 방법

C#에서 싱글톤 패턴을 구현하는 방법은 간단하지만 몇 가지 주의사항이 있습니다. 특히 멀티스레드 환경에서 안전하게 구현하는 것이 중요합니다.

public class Singleton
{
    // 1. 정적 변수로 인스턴스 선언
    private static Singleton _instance;
    private static readonly object _lock = new object();

    // 2. 생성자를 private으로 선언하여 외부에서 인스턴스화 하지 못하도록 함
    private Singleton()
    {
        // 초기화 코드 (필요시)
    }

    // 3. 전역 접근을 위한 정적 메서드 제공
    public static Singleton Instance
    {
        get
        {
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = new Singleton();
                }
                return _instance;
            }
        }
    }
}

3) 코드 설명

  • 정적 변수 선언 : _instance라는 정적 변수를 통해 클래스의 인스턴스를 저장합니다.
  • private 생성자 : 생성자를 private 으로 만들어 외부에서 new 키워드를 사용해 객체를 생성하지 못하도록 합니다.
  • 스레드 안전성 보장 : _lock 객체를 사용하여 멀티스레드 환경에서도 인스턴스가 단일하게 유지되도록 보장합니다.

4) 사용 사례

싱글톤 패턴은 로그 관리, 설정 파일 관리, 데이터베이스 연결 풀 등에서 사용됩니다. 이 패턴을 통해 특정 기능이 애플리케이션 전체에서 일관되게 사용될 수 있습니다.

 

2. 팩토리 패턴 (Factory Pattern)

1) 팩토리 패턴이란 ?

팩토리 패턴은 객체 생성 로직을 캡슐화하여 객체 생성의 책임을 팩토리 클래스에 위임하는 패턴입니다. 이를 통해 클라이언트는 객체 생성 방식에 대한 자세한 정보를 몰라도 원하는 객체를 얻을 수 있습니다. 팩토리 패턴은 객체의 생성 로직이 복작하거나 다양한 종류의 인스턴스를 생성해야 할 때 유용합니다.

 

2) 팩토리 패턴의 구현 방법

팩토리 패턴의 기본적익인 구조는 인터페이스나 추상 클래스를 사용해 객체 생성을 단순화하는 것입니다. 

// 1. Product 인터페이스 정의
public interface IProduct
{
    void DoSomething();
}

// 2. 구체적인 Product 클래스들
public class ProductA : IProduct
{
    public void DoSomething()
    {
        Console.WriteLine("ProductA 작업 실행");
    }
}

public class ProductB : IProduct
{
    public void DoSomething()
    {
        Console.WriteLine("ProductB 작업 실행");
    }
}

// 3. 팩토리 클래스 구현
public class ProductFactory
{
    public static IProduct CreateProduct(string type)
    {
        switch (type)
        {
            case "A":
                return new ProductA();
            case "B":
                return new ProductB();
            default:
                throw new ArgumentException("Invalid type");
        }
    }
}

// 4. 사용 예시
class Program
{
    static void Main(string[] args)
    {
        IProduct productA = ProductFactory.CreateProduct("A");
        productA.DoSomething();

        IProduct productB = ProductFactory.CreateProduct("B");
        productB.DoSomething();
    }
}

 

3) 코드 설명

  • 인터페이스 정의 : IProduct 인터페이스를 정의하여 제품의 기본 동작을 명시합니다.
  • 구체적인 클래스들 : ProductA와 ProductB는 IProduct 인터페이스를 구현하는 클래스입니다. 각 클래스는 자신만의 로직을 가집니다.
  • 팩토리 클래스 : ProductFactory는 CreateProduct 메서드를 통해 조건에 맞는 인스턴스를 생성하여 반환합니다. 이로써 클라이언트는 객체 생성의 세부사항을 몰라도 됩니다.

4) 사용 사례

팩토리 패턴은 객체 생성 로직이 복잡하거나 다양한 하위 클래스의 인스턴스를 생성해야 할 때 사용됩니다. 예를 들어 GUI 애플리케이션에서 버튼, 텍스트박스 등 다양한 UI 컴포넌트를 생성할 때 팩토리 패턴을 사용할 수 있습니다. 또 데이터페이스 연결처럼 여러 타입의 연결이 필요한 경우에도 유용합니다.

 

3. 싱글톤 패턴과 팩토리 패턴의 차이점

1) 목적 : 싱글톤 패턴은 하나의 인스턴스만을 생성하고 그 인스턴스를 전역적으로 사용하기 위해 사용되며, 팩토리 패턴은 객체 생성의 복잡한 로직을 감추고 필요한 인스턴스를 쉽게 만들기 위해 사용됩니다.

 

2) 사용 방식 : 싱글톤은 클래스 자체에 대한 인스턴스를 제한하고, 팩토리는 특정 조건에 맞는 인스턴스를 생성해 줍니다.

 

4. 마무리

싱글톤 패턴과 팩토리 패턴은 C#에서 매우 자주 사용되는 디자인 패턴입니다. 싱글톤은 하나의 인스턴스만 필요할 때 유용하고, 팩토리는 객체 생성 로직을 캡슐화하여 코드의 복잡성을 줄여줍니다. 이 두 패턴을 잘 이해하고 사용하면 개발 중 코드의 가독성, 유지보수성, 효율성을 크게 향상시킬 수 있습니다.

 

반응형