디자인 패턴은 소프트웨어 개발에서 자주 마주치는 문제들을 해결하기 위한 최적의 방법론입니다. 특히 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#에서 매우 자주 사용되는 디자인 패턴입니다. 싱글톤은 하나의 인스턴스만 필요할 때 유용하고, 팩토리는 객체 생성 로직을 캡슐화하여 코드의 복잡성을 줄여줍니다. 이 두 패턴을 잘 이해하고 사용하면 개발 중 코드의 가독성, 유지보수성, 효율성을 크게 향상시킬 수 있습니다.
'프로그래밍' 카테고리의 다른 글
Java 컬렉션 ArrayList, HashMap, HashSet 깊이 알아보기 (1) | 2024.12.05 |
---|---|
JVM의 작동 원리와 메모리 관리 (4) | 2024.12.04 |
HTML에서 자주 사용되는 태그 정의 및 사용법(div, span, a, p, h, ul, ol, li, img, form, table, input) (2) | 2024.12.02 |
[C# WPF] WVVM 디자인 패턴 (2) | 2024.11.27 |
Oracle 불필요한 문자 제거, REGEXP_REPLACE 사용법 (3) | 2024.11.25 |