java | January 20, 2022
Class의 여러 instances의 숫자를 컨트롤 하려는 이유는 대부분, shared resource에 대한 접근을 컨트롤 하기 위해서이다.
Singleton Pattern의 경우, object를 하나 생성하고 다른 object를 또 생성하고 싶을 때, 새로운 object를 얻는 것이 아니라 이미 생성된 object를 얻게 된다.
Regular constructor의 경우에는 항상 new object를 return 하도록 설계되었기 때문에, 이 방법으로는 singleton pattern을 구현할 수 없다.
⇒ 하나의 database object와 같이, 프로그램의 여러 군데에서 shared 되는 instance가 하나만 필요한 경우 사용한다.
Global variable처럼, singleton pattern은 어디에서든 some object에 접근할 수 있게 한다.
그러나 instance가 다른 code에 의해 overwritten 되는 것은 막는다.
⇒ Global variables를 strict 하게 관리해야 할 때 사용한다.
Government는 singleton pattern의 적절한 예시다. 하나의 국가는 official government를 하나만 가질 수 있다.
그 정부를 구성하는 개인의 identity와는 상관없이, ‘대한민국 정부’와 같은 타이틀은 그 그룹의 사람들을 식별하는 global access point 라고 볼 수 있다.
많은 test frameworks가 mock objects를 생성할 때 inheritance에 의존하기 때문에, singleton의 client code를 unit test 하는 것이 어려울 수 있다.
Singleton class의 constructor는 private 이고, static methods를 override 하는 것은 대부분의 언어에서 불가능하므로, singleton을 mock 할 수 있는 창의적인 방법을 생각해야 한다.
new
operator를 사용하지 못하도록, default constructor를 private으로 만든다.Constructor의 역할을 하는 static creation method를 만든다.
내부적으로 이 method는 private constructor를 호출하여 object를 생성하고 static field에 저장한다.
그 뒤로 이 method가 호출되면, 새로운 object를 생성하지 않고 첫번째 호출에서 생성된 cached object를 return 한다.
public class SingleObject {
// Create an object
private static SingleObject instance = new SingleObject();
// Make the constructor private
private SingleObject(){}
// Get the only object available
public static SingleObject getinstance() {
return instance;
}
}