'Singleton'에 해당되는 글 2건

  1. 2007.12.24 javascript singleton(자바스크립트 싱글 패턴) story (4)
  2. 2007.07.12 StringBuffer v1.1.0 used Prototype.js
자바스크립트 싱글 패턴 스토리 - I

사용자 삽입 이미지
여담 :
   참으로 싱글이 더욱 추워지는 날씨 입니다.
   내일은 싱글은 정말 속상한 하루 입니다.

   하지만 둘 일때 느끼는 추위는 싱글이 느끼는 추위보다
   더욱 춥습니다.


   그리고 더 추운 사람들은 둘이 할 수 없는
  사람들입니다.

  그런 사람들을 위해 따뜻한 손길을 뻗을 수 있는
  연말이 되었으면 합니다.




자바스크립트에서도 다양한 디자인 패턴이 가능합니다.
GoF 패턴 POSA 패턴 등 말이죠..

아마 UI 개발자 분들 중 javascript 를 이용하시는 분들은 대부분 패턴을 적용하신지 모른체 사용하고 계실꺼에요.  저도 Java 디자인 패턴 교육을 10일 동안(?) 참여했었는데요.  그 교육의 모든 예제가  Java 였습니다.  대형 프로젝트는 대부분 Java로 하니깐요..

또한 설계의 중요함을 포함해야 하는 언어이기도 하니깐요..
교육 중 다양한 패턴을 javascript 포팅을 해봤습니다. 큰 어려움은 없었습니다.






자자 서론이 길어졌습니다. 본론으로 들어가겠습니다.



위의 예제는 간단한 클래스 입니다.  foo() 를 new Operator를 통해서 foo()를 참조하는 인스턴스를
생성하였습니다.

bar와 zoo 의 constructor 는 같습니다.

하지만 인스턴스는 서로 다른 인스턴스를 같습니다.



위의 소스를 실행하보면 간단하게 알 수 있습니다.
당연히 다른 결과가 찍힐꺼라 생각됩니다.  여기서 잠시 삼천포로 빠지겠습니다.

저는 여러 예제를 봤습니다. 디자인 패턴 -> 싱글톤 도대체 이런것이 무슨 의미를 갖고 의미는 알 지언정
언제 적용해야하는 걸까? 적용해서 어떤 이점이 있을까?
또한 어떤 이점이 있고 언제 적용해야한다. ...  뭐 다양한 언어에 대해서 좋은 예시와 개념들이
많은 사이트에서 제공되고 있습니다.

하지만 몰랐습니다.  패턴이란걸 언제 쓰고 어디다 쓰고 해야하는 지!!

객체 지향에 대한 개념이 없었다는 것이었죠..  하지만 봐웠던게 도움이 많이 되었던것 같습니다.
개념을 정리하는 것이 단지 남의 예제와 예시를 보고 이해하는게 아닌 자기것으로 만드는 것
남앞에 "싱글 패턴"이 무엇이다 라고 사전적인 개념이 아닌 사전적 예시가 아닌 실제로
코드로 보여줄 수 있는 ... 역시 삼천포로 빠지는건 정리가 안됩니다...

결론은 한번 봐 놓으면 언젠간 도움이 됩니다.  아키텍쳐로 가는 것에 매우 도움이 될 것입니다.

결과는 수행해 보셨나요?

자 그러면 이해가 되지 않더라도 왜 이 글을 보고 있는지도 모르고 싱글 패턴이 먼지도 모르고 도대체
뭘 하려는 글인지 알지도 못할 지언정 "싱글 패턴이 무엇인가?" 라는 것만 꼭 올고 싶다면 위의 소스를 수행해보고 지금 이 소스를 수행해 보세요.



수행해 보셨어요?  결과는 처음 예제와는 조금 틀린 결과가 나왔네요.
당연히 new Operator 를 사용하지 않았기 때문 아니냐 라는 반문을 한다면 !!

여기서 잠깐 GoF에 나오는 싱글 패턴에 대한 소개!!
1. 접근하는 인스턴스는 오직 하나란 것이 보장이 되는 방법을 제시 해야 하며
2. 이렇게 유일한 인스턴스에 접근 할 수 있는 방법을 제공하여야 한다.

2번을 통해서 유일한 인스턴스를 제공하기 위해서 방법을 제공하였습니다.

또 하나.. 하지만 다른 누군가는 이것을 사용할때 new Operator 를 사용하면 어떻게 되느냐?
그러면 싱글 패턴이 깨지는 거 아니냐?

맞습니다. 

그렇다면 new Operator가 수행될 때 foo() 내에서 생성자를 통한 인스턴스 생성인지
아니면 싱글 패턴을 위한 방법(getInstance)에 의한 생성인지를 체크해서 new Operator를 사용할 경우에는
예외 처리를 하거나 하나의 인스턴스만 생성해 주면 되겠네요.

이 부분은 다음 시간에 다루겠습니다.

이어서 위의 소스를 잠깐 설명을 드리면 유일한 인스턴스를 제공하기 위한 메서드를 통해서
하나의 인스턴스를 생성하기 위해 new Operator 로 접근하는게 아니라

foo.getInstance() 를 통해서 접근하였습니다.
이는 foo() 의 인스턴스화 되면서 __instance__ static vairable가 설정되고 이 variable에 자신의 인스턴스가
저장됩니다.

즉 한번 생성된 foo 의 인스턴스는 null이던 this.__instance__ 에 저장되며 getInstance로 접근하게 되면
저장된 __instance__ 값을 계속해서 반환하게 됩니다.

이렇게 싱클 패턴의 조건을 만족하게 됩니다.
신고
Posted by Rhio.kim

사용법은 우선 Prototype 1.5.1 버젼이 있어야 하구요..
그 다음에 메서드에 대한 설명은 난중에 시간이 남을때 ㅠ.ㅠ
대충 보시믄 아셔여 ;; 부족한 부분도 있꾸..

메서드 부분도 추가했는데요...
대충 생각없이 적은거니 틀려도 걍 보세요..

아 간단하게 스트링 버퍼는 web2.0 개발에 있어서
동적 UI 좀더 자세히 innerHTML을 할꺼냐 동적으로 DOM 오브젝트로
사이트를 생성할꺼냐 innerHTML을 이용해서 생성할꺼냐인데...

스트링 버퍼를 이용한 innerHTML이 가장 빠릅니다.
모든 브라우저에서 테스트 해본것은 아니구요..

암튼 참고해서 쓰세요...

var TStringList = Class.create();
TStringList.prototype = {
    buf : new Hash(),
    temp : [],

 initialize: function() {},
   
    add : function(h) {
        typeof h == 'string' ? this.temp.push(h) : this.buf.merge(h);
    },
   
    text : function() {
        var t = this.temp; //this.temp = [];
        return t != [] ? t.join('') : this.buf.values();
    },
   
 hash : function(key, value) {
  if(typeof key != 'string') return false;

  this.buf.merge({ key : null});
  this.buf[key] = value;

  this.temp = [];
  return this.buf[key];
 },
 
    line : function(key) {
        return this.buf[key];
    },
   
    free : function() {
        this.temp = [];
    },
 
 iskey : function(key) {
  return (this.buf[key] == undefined) ? false : true ;
 }
}

var TTStringList = Class.create();   //get only once instance
    TTStringList._instance_ = null;
    TTStringList.getInstance = function() {
        if(this._instance_ == null) this._instance_ = new TStringList();
        return this._instance_;
    }


Method

add(h)
Return Value 없음
Parameters h String과 Hash 값만 허용합니다.
Exceptions 없음
Description 이 메서드는 String이 올때는 스트링 버퍼(temp 배열)에 계속 누적시키고 Hash가 들어왔을 경우에는 Prototype의 Hash.merge 메서드를 이용해 기존에 property가 존재할 경우에는 replace를 시키고 없을 경우에는 기존 Hash Map에 추가시킵니다.

text( )
Return Value string
Parameters 없음
Exceptions 없음
Description 이 메서드는 현재 스트링 버퍼에 담긴 값이 있는 경우에는 temp에 누적된 스트링을 전부 반환합니다. 그리고 버퍼는 비워있고 Hash 맵이 존재하는 경우에는 Hash맵이 있는 경우에는 Hash.values()를 내부적으로 이용해 Hash Map의 value 값만 반환합니다.

hash(key, value)
Return Value string
Parameters key - value에 넘어올 String을 Hash Map에 저장할 Key 입니다. 반대로 value 는 저장될 실제 데이터입니다.
Exceptions key는 무조건 String만 허용합니다. 그렇지 않은 경우에는 flase를 반환합니다.
Description 이 메서드는 Hash로 생성하는 메서드로 value에 넘어온 값을 Hash Map 등록하고 Key 에 해당하는 value값을 반환합니다.

line(key)
Return Value string
Parameters key - Hash key
Exceptions 없음
Description 이 메서드는 생성된 Hash Map에서 key에 해당하는 value를 반환합니다.

free( )
Return Value string
Parameters none
Exceptions none
Description none

iskey(key)
Return Value boolean
Parameters key - 내부 Hash Map의 key(property)
Exceptions 없음
Description 이 메서드는 내부 Hash Map에 해당 key 값이 존재하는지 체크하여 존재하면 true, 없으면 false를 반환합니다.

신고
Posted by Rhio.kim