서비스 소비자와 서비스 제공자간을 중개하여 서로 직접적인 커플링 없이 상호작용 할 수 있도록 한 패턴
1. 서비스 인터페이스 정의
public interface AudioService {
void playSound();
}
2. 구체적인 서비스 구현
public class MusicService : AudioService
{
public void PlaySound()
{
}
}
public class BGMService : AudioService
{
public void PlaySound(AudioClip audio)
{
}
}
3. 서비스 로케이터 구현
public class ServiceLocator
{
private Dictionary<string, IAudioService> serviceRegistry = new Dictionary<string, IAudioService>()
public static AudioService Provide(string serviceName, IAudioService provide) {
serviceRegistry[serviceName] = provide;
}
public static AudioService GetAudio(string serviceName)
{
return serviceRegistry[serviceName];
}
}
4. 클라이언트 코드
public class PlayerController : MonoBehaviour
{
[SerializeField] private AudioClip audio;
void Start()
{
ServiceLocator.Provide("BGMAudio",new BGMService())
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ServiceLocator.GetAudio("BGMAudio").PlaySound(audio);
}
}
}
싱글톤과의 비교
측면 |
싱글톤 패턴 |
서비스 중개자 패턴 |
결합도 |
높음 (다른 시스템이 직접 오디오 매니저에 의존) |
낮음 (중개자를 통해 통신하여 시스템 간 의존성 감소) |
유연성 |
낮음 (오디오 시스템 변경 시 영향이 큼) |
높음 (서비스 제공자를 교체하거나 추가하기 용이) |
구현 복잡도 |
낮음 (구현이 간단하고 이해하기 쉬움) |
중간 (약간의 복잡도가 있지만 관리 용이) |
테스트 용이성 |
낮음 (전역 상태로 인해 테스트 어려움) |
높음 (의존성 분리가 잘 되어 테스트가 용이) |