Знаниями нужно делится...

Паттерн «Одиночка» (pattern singleton) средствами JavaScript.

Назад к списку | Просмотров: 3632

Сам по себе паттерн одиночка является удобным средством создания уникального объекта в ООП. Отличная альтернатива глобальным переменным или куче статических методов и членов внутри класса.

Класс реализующий паттерн одиночка подразумевает, что класс будет иметь только один экземпляр объекта и доступ к объекту должен быть возможет в любом участке программы.

На языке программирования со строгой типизацией, реализация паттерна в общем виде может выглядеть примерно следующим образом (пример на языке Java):

class Singleton {
    //статический член класса хранит единственный экземпляр
    private static Singleton inst = null;
     
    //закрытый   конструктор не даст создать вне класса новый экземпляр класса
    private Singleton() {}
     
    /**/ 
    public static Singleton getInstance() {
        if(inst == null) {
            //данная конструкция даст гарантию от переопределения экземпляра
            // в случаи одновременного обращения нескольких потоков
            synchronized(Singleton.class) {
                 if(inst == null) {
                     inst = new Singleton();
                 }
            }
        }
        return  inst;   
    }
}

Закрытый тип конструктора даст гарантию что объект не может быть создан из вне, а статический метод представляет доступ к единственному экземпляру класса, хранимому в закрытом члене inst.

Но в случаи языка JavaScript не все так просто, так как его консрукции не поддерживают защищенные методы и члены. Поэтому придется идти на некоторые хитрости.

Пример на языке JavaScript:

//класс обертка  Singleton
var Singleton = function(){
    // внутренний класс  Singleton
    var _Singleton = function(){
        var obj = this;
        obj.method1 = function(){
	       return "method 1";
        }
        return obj;
    }, 
    //  «статический» член  класса
    _inst = null;

    return {
        getInstance:function(){
           if(!_inst ){
               // создание уникального экземпляра класса
               _inst  = new _Singleton();
           }
           return _inst;
        }
    };
}();

var o = Singleton.getInstance();
alert(o.method1());

Переменная Singleton является глобальным объектом имеющая только один единственный метод getInstance (). При вызове этого метода создается экземпляр класса _Singleton и сохраняется в переменной _inst, теперь доступ к экземпляру класса доступен из любого места кода.


дата 07/01/2013


Оставить комментарий
8 + 3 =

Топ статей

Анонимная функция и замыкание
Дата 2017.08.14, автор admin
Python ошибки в приведении типов
Дата 2017.08.14, автор admin
Основы многопоточности в GoLang
Дата 2017.08.20, автор admin
Как использовать mysql в приложения go lang
Дата 2017.08.22, автор admin
ORM для Go lang
Дата 2017.08.29, автор admin