---
### 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#으로 구현하면 보다 구조적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다. 여러 패턴을 학습하고 적용함으로써 프로젝트의 코드를 한층 발전시킬 수 있습니다.