클래스의 인스턴스를 오직 하나만 생성하는 Singleton Pattern을 알아보자. 기술은 향기와 같다. 막아도 냄새를 맡을 수 있는 것이다. 옳바른 향기를 피워보자.
개념
- Java에서의 싱글톤 정의 패턴
1) 자신을 private 멤버변수로 선언
2) private 생성자 정의
3) public static synchronized 형태 getInstance() 메소드 정의
4) 자신의 변수가 null인지 아닌지 체크
class Singleton
{
private static Singleton instance; // 1)
private Singleton() // 2)
{
...
}
public static synchronized Singleton getInstance() // 3)
{
if (instance == null) // 4)
instance = new Singleton();
return instance;
}
...
public void doSomething()
{
...
}
}
- Global Scope에 격리되고 내부 변수를 공유한다
> Constructor Function을 정의한다
> Closure 객체안에서 Constructor Function을 한번만 new하는 로직을 넣고 Closure객체를 return한다
var mySingleton = (function () {
// Instance stores a reference to the Singleton var instance; function Init() { // define Constructor Function // Singleton // Private methods and variables function privateMethod(){ console.log( "I am private" ); } var privateVariable = "Im also private"; var privateRandomNumber = Math.random(); return { // Public methods and variables publicMethod: function () { console.log( "The public can see me!" ); }, publicProperty: "I am also public", getRandomNumber: function() { return privateRandomNumber; } }; }; return { // return the Closure Object // Get the Singleton instance if one exists // or create one if it doesn't getInstance: function () {
// 생성이 안되었으면 최초에 한번만 init 한다 if ( !instance ) { instance = Init(); } return instance; } }; })();
// 잘 못된 예제 var myBadSingleton = (function () { // Instance stores a reference to the Singleton var instance; function init() { // Singleton var privateRandomNumber = Math.random(); return { getRandomNumber: function() { return privateRandomNumber; } }; }; return { // Always create a new Singleton instance getInstance: function () {
instance = init(); return instance; } }; })(); var singleA = mySingleton.getInstance(); var singleB = mySingleton.getInstance(); console.log( singleA.getRandomNumber() === singleB.getRandomNumber() ); // true var badSingleA = myBadSingleton.getInstance(); var badSingleB = myBadSingleton.getInstance(); console.log( badSingleA.getRandomNumber() !== badSingleB.getRandomNumber() ); // true
<참조>
- 원문 : Singleton Pattern
- OODesign : Singleton Pattern
'Languages > JavaScript' 카테고리의 다른 글
[JavaScript] Design Pattern - Mediator Pattern (0) | 2013.09.14 |
---|---|
[JavaScript] Design Pattern - Observer Pattern (0) | 2013.09.07 |
[JavaScript] Design Pattern - Module Pattern (0) | 2013.09.07 |
[JavaScript] Design Pattern - Constructor Pattern (0) | 2013.09.07 |
[JavaScript] 피해야하는 사용 패턴들 (Anti-Patterns) (0) | 2013.08.30 |