Skip to content

Instantly share code, notes, and snippets.

@djkeh
Last active August 1, 2017 06:22
Show Gist options
  • Save djkeh/3cbbce75df1617541ecfee2638255784 to your computer and use it in GitHub Desktop.
Save djkeh/3cbbce75df1617541ecfee2638255784 to your computer and use it in GitHub Desktop.
static 사용을 제한한 싱글턴 구조의 표현
// static 사용을 제한한 싱글턴 구조의 표현 예제
using System;
public class SingletonService
{
public string GetMessage() => "Hello World";
}
public class ClientModule
{
private readonly SingletonService _service;
public ClientModule(SingletonService service)
{
_service = service ?? throw new ArgumentNullException(nameof(service));
}
public void PrintMessage() => Console.WriteLine(_service.GetMessage());
}
public class IocContainer
{
private readonly Func<ClientModule> _factory;
public IocContainer(Func<ClientModule> factory)
{
_factory = factory ?? throw new ArgumentNullException(nameof(factory));
}
public ClientModule GetModule() => _factory.Invoke();
}
public class Program
{
public static void Main(string[] args)
{
var singleton = new SingletonService();
var container = new IocContainer(() => new ClientModule(singleton));
Run(container);
}
private static void Run(IocContainer container)
{
for (int i = 0; i < 5; i++)
{
ClientModule module = container.GetModule();
Execute(module);
}
}
private static void Execute(ClientModule module) => module.PrintMessage();
}
@gyuwon
Copy link

gyuwon commented Jul 21, 2017

  1. public은 공개 범위를 뜻합니다. final인가, abstract인가는 직교 차원이죠. 따라서 Java의 경우 non-public이라 하면 패키지 범위가 되겠죠.
  2. 서비스를 구현하는 측에서 static을 사용하는 것과 서비스를 소비하는 측에서 static을 사용하는 것은 많이 다릅니다.
  3. 경우에 따라 단일 인스턴스 사용이 바람직하지만 필수적이진 않을 수 있습니다. 이 땐 다중 스레딩으로 인해 둘 이상의 인스턴스 생성 가능성이 존재하더라도 관대하게 넘어갈 수 있죠. 하지만 만약 한 프로세스 메모리에 반드시 인스턴스가 하나만 존재해야 하며 둘 이상이 만들어지면 문제가 발생하는 경우라면 엄격한 방법을 선택하게 됩니다.

@djkeh
Copy link
Author

djkeh commented Aug 1, 2017

Gist에 알림 기능이 없어 댓글을 이제야 확인했습니다. 늦은 답신 죄송합니다. 싱글턴 패턴을 적용할 때 그 정도를 관대하거나 엄격하게 조절할 수 있다는 사실이 신선하게 다가오네요. 친절한 답변 정말 감사합니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment