소스를 보다가 싱글톤 패턴이 적용된 내용을 보았습니다.
저야 아이들 아빠니깐 그다지 싱글에는 관심이 없었지만..ㅎㅎ
(새해부터 죄송합니다. 이런 무리한 글을..ㅠㅠ)
사실 패턴 관련해서는 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 constructorshttp://weblogs.macromedia.com/sho/archives/2006/04/as3_--_on_the_l.cfm하지만 아직 자바스크립트 2 의 스펙이 다 제정된것은 아니지만 해당 생성자에 대한 부분은
처리가 된것 같군요.
해당 부분을 어떻게 처리할지 모르겠으나 조만간 반영이 되지 않을까 생각해봅니다.
(Resolved) Private constructors are useful, common, and need to be supportedhttp://bugs.ecmascript.org/ticket/166하지만 아직은 지원되는게 아니니깐.
필요하시다면
AS3.0 Better Singletonshttp://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 wayhttp://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;
}
}
}
댓글 영역
그부분은 as3에서는 생성자를 private나 protected로 선언이 안되는데
public으로만 되요, 그러면 외부에서도 삭제나 생성할수 있기때문에 그걸 막을려고
꽁수로 생성자에 인자값을 하나 줘요 (클래스형태로)
public 생성자(인자:인자형클래스):void <<이런식으로
그리고 인자형클래스를 선언할때
internal로 선언하는거죠 외부에서는 접속못하게
이러면 생성자 자체는 public이라서 외부에서 접속이 가능하지만 인자값자체가 internal이라서 결론적으로 외부에서 접속이 안되죠
생각해보니 공홈 제안이 저가 써온거 보다 더 좋네요. 역시 ...흠 좋은 글이네요 더 좋은글 기대 할께요. 감사해요. ㅋㅋ 참 깜찍한 발상인거같아요 ... ㅋㅋ
좀 아쉽죠.
저건 좀 오래된 노하우라 더 찾아보시면 좋은 아이디어가 있을지도.
좋은 글 감사합니다.;;
좀 더 좋은 아이디어를 생각해보는것도 흥미로울듯 합니다.
오히려 제가 더 고마운 일이죠. ^^