본문 바로가기

인사이드RIA/인사이드플렉스

싱글톤 패턴 사용하기

반응형
소스를 보다가 싱글톤 패턴이 적용된 내용을 보았습니다.
저야 아이들 아빠니깐 그다지 싱글에는 관심이 없었지만..ㅎㅎ
(새해부터 죄송합니다. 이런 무리한 글을..ㅠㅠ)

사실 패턴 관련해서는 GoF 의 디자인 패턴부터 Java 언어로 배우는.., 자바디자인패턴과 리팩토링 등등 많은 책을 보유하고 있으나 제대로 읽고 적용해본 내용이 없더군요.
그나마 최근 읽고 있는 '패턴 그리고 객체지향적 코딩의 법칙/문우식/한빛미디어' 에서
위안이 되는 글을 찾았습니다.

더 정확히 이야기하면 불필요한 부분에 패턴을 적용하기 위해 머리를 싸매지 마라.
여러분들은 객체지향 프로그래밍을 하는 것이지 패턴 프로그래밍을 하는 것이 아니다.
경험이라는 이름의 시행착오를 거치지 않고는 아무리 패턴을 많이 사용해도 절대 좋은 코드를 얻을 수 없다는 점을 알아야 한다.

그래 아직 경험이 부족한 탓이구나...~~ 라고..

본론을 이야기하면 ActionScript 3 에서는 싱글톤 패턴을 구현할때 Java 와 같이 구현할 수가 없습니다.
일반적으로 Java 에서는 생성자에서 private 을 사용하여 싱글톤 패턴을 만든다고 하더군요.
하지만 ActionScript 3 에서는 생성자에서 public 을 사용하여야만 합니다.
private 나 protected 를 사용하지 못한다는 것이지요.
때문에 싱글톤 패턴을 구현하기 위하여 일종의 꽁수가 들어갑니다.

이렇게 된 원인(?)은 ActionScript 3 개발당시에 ECMA 4th edition(자바스크립트 2) 의 스펙이 아직 확정되지 않았기때문에 잠정적인 위험을 배제하기 위하여 어쩔 수 없는 선택이었던것 같습니다.
AS3 -- on the lack of private and protected constructors
http://weblogs.macromedia.com/sho/archives/2006/04/as3_--_on_the_l.cfm

하지만 아직 자바스크립트 2 의 스펙이 다 제정된것은 아니지만 해당 생성자에 대한 부분은
처리가 된것 같군요.
해당 부분을 어떻게 처리할지 모르겠으나 조만간 반영이 되지 않을까 생각해봅니다.
(Resolved) Private constructors are useful, common, and need to be supported
http://bugs.ecmascript.org/ticket/166

하지만 아직은 지원되는게 아니니깐.
필요하시다면
AS3.0 Better Singletons
http://blog.pixelbreaker.com/flash/as30-better-singletons/
  
package
{
	public class Singleton
	{
		public static var instance:Singleton;

		public static function getInstance():Singleton
		{
			if( instance == null )
			{
				instance = new Singleton( new SingletonEnforcer() );
			}
			return instance;
		}

		public function Singleton( pvt:SingletonEnforcer )
		{
			// init class
		}
	}
}

internal class SingletonEnforcer{}


또는 아래 에서 제안하는 형식을 따라주면 될것 같습니다.
AS3 Singletons, the other way
http://www.nulldesign.de/2007/11/20/as3-singletons-the-other-way/
 
package {
	public class Singleton {
		private static var instance:Singleton;
		private static const checker:Object = {};

		public function Singleton(initObj:Object) {
			if(initObj != checker) {
				throw new Error("Private constructor!");
			}
		}

		public static function getInstance():Singleton {
			if(instance == null) {
				instance = new Singleton(checker);
			}
			return instance;
		}
	}
}
728x90