Last active
August 1, 2017 06:22
-
-
Save djkeh/3cbbce75df1617541ecfee2638255784 to your computer and use it in GitHub Desktop.
static 사용을 제한한 싱글턴 구조의 표현
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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(); | |
} |
public
은 공개 범위를 뜻합니다.final
인가,abstract
인가는 직교 차원이죠. 따라서 Java의 경우non-public
이라 하면 패키지 범위가 되겠죠.- 서비스를 구현하는 측에서
static
을 사용하는 것과 서비스를 소비하는 측에서static
을 사용하는 것은 많이 다릅니다. - 경우에 따라 단일 인스턴스 사용이 바람직하지만 필수적이진 않을 수 있습니다. 이 땐 다중 스레딩으로 인해 둘 이상의 인스턴스 생성 가능성이 존재하더라도 관대하게 넘어갈 수 있죠. 하지만 만약 한 프로세스 메모리에 반드시 인스턴스가 하나만 존재해야 하며 둘 이상이 만들어지면 문제가 발생하는 경우라면 엄격한 방법을 선택하게 됩니다.
Gist에 알림 기능이 없어 댓글을 이제야 확인했습니다. 늦은 답신 죄송합니다. 싱글턴 패턴을 적용할 때 그 정도를 관대하거나 엄격하게 조절할 수 있다는 사실이 신선하게 다가오네요. 친절한 답변 정말 감사합니다!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@gyuwon
안녕하세요,
https://justhackem.wordpress.com/2017/07/05/singleton-is-not-static/
위 글을 읽고 잘 이해가 안 됐던 부분을 개인적으로 질문드렸었는데요,
"싱글턴 규칙을 더 엄격하게 하려면 인터페이스를 정의하고 구현체 non-public final 클래스를 만들어 private 기본 생성자와 public static 인스턴스를 사용할 수 있다"고 말씀해 주셨습니다. 이에 몇 가지 이어서 떠오른 질문을 드리고 싶습니다.
static
이 필요한 요소가 되는 것인가요? 블로그 원문은 static하지 않은 싱글턴의 디자인을 논하고 있었기 때문에 아마 이런 의도로 말씀하신게 아니었을 것으로 생각하지만, 잘 이해하지 못했습니다.싱글턴 규칙을 더 엄격하게
적용한다는 말씀을 약간 어렵게 느끼고 있었습니다.제가 C# 코딩은 미숙하여, 샘플 코드는 건드리지 않고 블로그의 것을 그대로 옮겨왔습니다.
여유가 있으실 때 한 번 읽어봐 주시길 부탁드립니다.
감사합니다.