개요

서비스 로케이터 패턴은 소프트웨어 디자인 패턴으로, 애플리케이션 내의 서비스 위치를 추상화하여 서비스에 대한 검색을 캡슐화합니다. 이 패턴은 애플리케이션 내에서 서비스의 위치를 중앙 집중화하여 유연성을 향상시킵니다.

작동 원리

  1. 서비스 등록: 애플리케이션 시작 시, 서비스 로케이터에 서비스를 등록합니다. 이때 서비스는 인터페이스를 통해 등록됩니다.
  2. 서비스 검색: 서비스가 필요한 클라이언트는 서비스 로케이터를 사용하여 필요한 서비스를 검색합니다.
  3. 서비스 반환: 서비스 로케이터는 등록된 서비스를 찾아서 반환합니다.

장점

  • 중앙 집중화된 서비스 위치: 서비스 로케이터를 통해 서비스의 위치를 중앙 집중화하여 관리할 수 있습니다.
  • 유연성: 서비스의 위치를 동적으로 변경할 수 있으며, 클라이언트는 서비스의 구체적인 위치를 알 필요가 없습니다.
  • 서비스 검색의 캡슐화: 서비스 로케이터를 통해 서비스 검색을 캡슐화하여 클라이언트 코드를 단순화할 수 있습니다.

단점

  • 의존성: 서비스 로케이터에 의존하게 되므로, 의존성이 높아질 수 있습니다.
  • 숨겨진 의존성: 서비스 로케이터를 사용하면 서비스의 위치가 숨겨져 있어서 코드를 이해하기 어려울 수 있습니다.

사용 사례

  • 다중 구현을 가진 서비스의 위치를 추상화할 때 유용합니다.
  • 서비스 위치를 동적으로 변경해야 할 때 사용할 수 있습니다.
  • 프레임워크나 라이브러리에서 많이 사용됩니다.
using System;
using System.Collections.Generic;

// 인터페이스: ILogger
public interface ILogger
{
    void Log(string message);
}

// 구현 클래스: ConsoleLogger
public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine("[Console] " + message);
    }
}

// 구현 클래스: FileLogger
public class FileLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine("[File] " + message);
    }
}

// 서비스 로케이터 클래스
public class ServiceLocator
{
    private Dictionary<string, ILogger> services;

    public ServiceLocator()
    {
        services = new Dictionary<string, ILogger>();
        // 서비스 등록
        services["ConsoleLogger"] = new ConsoleLogger();
        services["FileLogger"] = new FileLogger();
    }

    // 서비스 검색 메서드
    public ILogger GetLogger(string serviceName)
    {
        if (services.ContainsKey(serviceName))
        {
            return services[serviceName];
        }
        else
        {
            throw new KeyNotFoundException("Service not found: " + serviceName);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 서비스 로케이터 생성
        ServiceLocator locator = new ServiceLocator();

        // 로깅 서비스 가져오기
        ILogger consoleLogger = locator.GetLogger("ConsoleLogger");
        ILogger fileLogger = locator.GetLogger("FileLogger");

        // 로깅
        consoleLogger.Log("This is a log message to console");
        fileLogger.Log("This is a log message to file");
    }
}
반응형

'Programming > Design Pattern' 카테고리의 다른 글

비지터 패턴(Visitor Pattern)  (0) 2019.04.12
중재자 패턴(Mediator Pattern)  (0) 2018.02.20
애자일 설계  (0) 2017.11.11
옵저버 패턴(Observer Pattern)  (0) 2015.12.15
스트래티지 패턴(Strategy Pattern)  (0) 2015.12.13
객체 지향 프로그래밍(OOP)  (0) 2015.12.12
디자인 패턴의 종류  (0) 2015.08.16