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

사실 패턴 관련해서는 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;
		}
	}
}
신고
Posted by 열이아빠

댓글을 달아 주세요

  1. Favicon of http://blog.jidolstar.com 지돌스타 2008.05.14 10:15 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 글이네용~~ ^^

  2. Favicon of http://yussi.net yussi 2008.05.26 16:33 신고  댓글주소  수정/삭제  댓글쓰기

    AS3.0 Better Singletons에서 internal class SingletonEnforcer{} 부분은 어떤 부분인지 알려주시면 안될까요?...

  3. 박스농사 2008.05.26 17:45 신고  댓글주소  수정/삭제  댓글쓰기

    ㅋㅋㅋㅋ
    그부분은 as3에서는 생성자를 private나 protected로 선언이 안되는데
    public으로만 되요, 그러면 외부에서도 삭제나 생성할수 있기때문에 그걸 막을려고
    꽁수로 생성자에 인자값을 하나 줘요 (클래스형태로)
    public 생성자(인자:인자형클래스):void <<이런식으로

    그리고 인자형클래스를 선언할때
    internal로 선언하는거죠 외부에서는 접속못하게
    이러면 생성자 자체는 public이라서 외부에서 접속이 가능하지만 인자값자체가 internal이라서 결론적으로 외부에서 접속이 안되죠

  4. not null 2010.07.01 13:40 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 내용 잘보고 갑니다.

  5. 질문 2011.04.04 00:08 신고  댓글주소  수정/삭제  댓글쓰기

    싱글톤을 써오다가 다른 사람은 어떻게 쓰나 ... 구경왔는데 ... ㅋ 저도 생성자에 에러 집어 넣고 쓰는데
    생각해보니 공홈 제안이 저가 써온거 보다 더 좋네요. 역시 ...흠 좋은 글이네요 더 좋은글 기대 할께요. 감사해요. ㅋㅋ 참 깜찍한 발상인거같아요 ... ㅋㅋ

    • Favicon of http://koko8829.tistory.com 열이아빠 2011.04.04 13:20 신고  댓글주소  수정/삭제

      이 정도 되면 API 단에서 구현해주어도 괜찮을텐데요.
      좀 아쉽죠.
      저건 좀 오래된 노하우라 더 찾아보시면 좋은 아이디어가 있을지도.

  6. Favicon of http://tawool.tistory.com 타울 2011.08.22 02:15 신고  댓글주소  수정/삭제  댓글쓰기

    아이디어가 참 뛰어난 것 같습니다.ㅎ
    좋은 글 감사합니다.;;

  7. 2011.08.22 03:18  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다



Yesterday639
Today257
Total1,986,988

티스토리 툴바