─━ IT ━─

다양한 디자인 패턴을 C#으로 구현해보자

DKel 2024. 11. 2. 17:17
반응형
디자인 패턴은 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위한 일반적인 해결책입니다. C#으로 이러한 패턴을 구현하면 코드의 재사용성과 유지보수성을 높일 수 있습니다. 이번 글에서는 여러 디자인 패턴 중 몇 가지를 C#으로 구현해 보겠습니다. 각 패턴은 코드 예제와 함께 설명할 것입니다.

 
---
 
### Singleton 패턴
 
Singleton 패턴은 클래스의 인스턴스를 하나만 생성하도록 보장합니다. 자주 사용되는 예로는 설정값이나 데이터베이스 연결 같은 리소스를 필요 이상으로 생성하지 않도록 할 때 사용합니다.
 
```csharp
public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object padlock = new object();
 
    Singleton()
    {
    }
 
    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
}
```
 
위의 코드는 `Instance` 속성을 통해 Singleton 인스턴스를 생성하고, 이를 통해 객체가 여러 번 생성되는 것을 막습니다.
 
---
 
### Factory 패턴
 
Factory 패턴은 객체 생성의 로직을 분리하여 클라이언트 코드가 이 로직에 의존하지 않도록 합니다. 이를 통해 객체 생성 방법을 쉽게 변경할 수 있습니다.
 
```csharp
public interface IProduct
{
    string GetName();
}
 
public class ConcreteProductA : IProduct
{
    public string GetName()
    {
        return "ConcreteProductA";
    }
}
 
public class ConcreteProductB : IProduct
{
    public string GetName()
    {
        return "ConcreteProductB";
    }
}
 
public class ProductFactory
{
    public static IProduct CreateProduct(string type)
    {
        if (type == "A")
        {
            return new ConcreteProductA();
        }
        else if (type == "B")
        {
            return new ConcreteProductB();
        }
        else
        {
            throw new ArgumentException("Invalid type");
        }
    }
}
```
 
클라이언트는 `ProductFactory`를 통해 제품의 종류를 지정하여 객체를 생성할 수 있습니다. 특정 클래스에 직접 접근하지 않고 `CreateProduct` 메서드를 호출함으로써 객체가 생성됩니다.
 
---
 
### Observer 패턴
 
Observer 패턴은 객체의 상태 변화를 다른 객체에 통보하는 패턴입니다. 주로 이벤트 처리 시스템에서 사용됩니다.
 
```csharp
using System;
using System.Collections.Generic;
 
public class Subject
{
    private List<IObserver> observers = new List<IObserver>();
 
    public void Attach(IObserver observer)
    {
        observers.Add(observer);
    }
 
    public void Detach(IObserver observer)
    {
        observers.Remove(observer);
    }
 
    public void Notify()
    {
        foreach (var observer in observers)
        {
            observer.Update();
        }
    }
 
    public void ChangeState()
    {
        Console.WriteLine("State has changed.");
        Notify();
    }
}
 
public interface IObserver
{
    void Update();
}
 
public class ConcreteObserver : IObserver
{
    public void Update()
    {
        Console.WriteLine("Observer has been updated.");
    }
}
```
 
`Subject` 객체 상태가 변경되면 `Notify` 메서드를 호출하여 모든 등록된 `Observer` 객체에 알림을 보냅니다. 각 `Observer`는 `Update` 메서드를 구현하여 상태 변화를 처리합니다.
 
위와 같은 디자인 패턴을 C#으로 구현하면 보다 구조적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다. 여러 패턴을 학습하고 적용함으로써 프로젝트의 코드를 한층 발전시킬 수 있습니다.

반응형