학습
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. 흔한 실수와 주의사항
- 잘못된 코드:
var product = factory.CreateProduct("C"); // 존재하지 않는 유형
- 올바른 코드:
var product = factory.CreateProduct("A"); // 존재하는 유형
- 잘못된 코드:
var instance1 = new ConfigurationManager(); // 인스턴스를 직접 생성
var instance2 = new ConfigurationManager();
- 올바른 코드:
var instance1 = ConfigurationManager.Instance; // 싱글톤 인스턴스 사용
var instance2 = ConfigurationManager.Instance;
6. 정리
다음에 학습하면 좋은 주제: