본문으로 건너뛰기

싱글톤 패턴_JavaScript 디자인 패턴 3

무료2015-07-14#JS#Design_Pattern#JavaScript设计模式#JavaScript单例模式#Singleton_Pattern

Singleton(싱글톤) 패턴은 JS 에서 구현이 매우 간단하며, 의존성 주입을 고려하지 않는 경우 객체 리터럴 방식으로 생성된 객체는 싱글톤입니다. 본고에서는 JS 중의 싱글톤 패턴을 자세히 소개합니다

一.싱글톤 패턴의 역할

单件模式经常被用来管理资源敏感的对象,比如:数据库连接对象、注册表对象、线程池对象等等,这种对象如果同时存在多个的话就会造成各种不一致的麻烦(你总不希望发生数据库重复连接的异常吧)

黯羽轻扬:设计模式之单件模式(Singleton Pattern) 에서 인용

게다가, 싱글톤 패턴은 메모리 오버헤드를 줄이기 위해서도 사용할 수 있습니다 (거대한 객체가 하나만 있음을 보증)

二.가장 심플한 싱글톤 패턴

var singleton = {
    // attr: val
}

네, 이뿐입니다. singleton 이 가리키는 객체는 유일하며, 다른 방식으로 이러한 객체를 생성할 수 없습니다 (딥 카피는 제외. 카피의 전제는 이미 그러한 객체가 존재하기 때문입니다). 생성자 방식으로 구현된 싱글톤과 비교하여, 객체 리터럴에는 자연스러운 이점이 있습니다——그것은 "일회성"인 것입니다

이 싱글톤에는 강한 의존 (밀결합) 의 단점이 있으며, 의존 관계는 객체 리터럴 중에 제한되어 있고, 심지어 초기화 시 파라미터를 전달하는 것도 불가능합니다 (싱글톤 자체는 기능이 완전한 객체 (모듈) 이며, 초기화 시 파라미터를 전달할 수 없는 경우, 반드시 그 기능에 영향을 미칩니다)

三.일반적인 싱글톤 패턴

모듈 패턴과 결합하여 위의 문제를 수리할 수 있습니다. 예를 들어:

var singleton = (function() {
    var obj;    // 单例의 引用

    function init() {
        // 私有属性
        // var attr = val
        
        return {
            // 公有属性
            // attr: val
        }
    }

    return {
        getInstance: function() {
            if (!obj) {
                obj = init();
            }

            return obj;
        }
    }
})();

// 使用
var mySingleton = singleton.getInstance();
// mySingleton.xxx

singleton.getInstance() 이 글로벌 액세스 진입점이며, 이 진입점에서 가져오는 객체는 모두 동일합니다. 지연 초기화가 필요하지 않은 경우, getInstance 인터페이스를 제공할 필요가 없고, 직접 싱글톤 객체를 반환하면 됩니다. 물론, 대부분의 경우, 싱글톤 패턴은 거대한 객체를 의미하며, 지연 초기화는 매우 필요합니다

四.JavaScript 중 싱글톤 패턴의 역할

브라우저 환경 중의 JS 는 싱글스레드이며, 임계 자원을 관리할 필요가 없고, 자원 민감한 대 객체 (데이터베이스 연결 객체, 등록표 객체, 스레드풀 객체 등) 도 존재하지 않습니다. 이렇게 보면, JS 중의 싱글톤 패턴은 쓸모없는 것처럼 보입니다.

事实确实是这样입니다. JS 중의 싱글톤 패턴의 유일한 용도는 아마도 거대한 객체를 관리하는 것이며, 동시에 여러 거대한 객체가 존재하는 것으로 인한 메모리 소비를 회피하는 것입니다. 예를 들어 jQuery 와 같은 톱레벨 네임스페이스, 및 각 레벨의 자식 네임스페이스에서, 싱글톤 패턴으로 관리함으로써 혼란을 회피할 수 있습니다

참고 자료

댓글

아직 댓글이 없습니다

댓글 작성