NazimovDmitrii
6/28/2019 - 1:13 AM

[JS Паттерн ОДИНОЧКА SINGLETON + синтаксис ООП ES6] #js #ООП #ES6 #Инкапсуляция #Паттерны

[JS Паттерн ОДИНОЧКА SINGLETON + синтаксис ООП ES6] #js #ООП #ES6 #Инкапсуляция #Паттерны

	/**
 *
 * ПАТТЕРН SINGLETON
 * 
 *	Паттерн Одиночка гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
 *
 */



var privateMethod = Symbol(); // Чтобы создать приватный метод приходится такую ерунду писать. Ничего лучше пока не придумали. 
class Singleton {
    static #instance = null; // Объявляем статическое приватное свойство. # - значит приватное.

    constructor(num) {
        if (Singleton.#instance) { // проверяем что значение #instance не равно null (т.е. уже что-то присвоено), и прерываем инструкцию, чтобы в соответствии с принципом синглтон сохранить значения присвоенные при первой инициации.
            return Singleton.#instance;
        }
        this.state = "justtext";
        Singleton.#instance = this;
        this.publicMethod(num); // автовызов публичного метода в конструкторе. Можно не вызывать в конструкторе, а только вручную
        this[privateMethod]() // call private
    }

    publicMethod(num='default string ') { // Публичный метод с примером дефолтного значения аргумента.
        console.log('publicMethod: ' + num + this.state);
    }

    [privateMethod]() { // Приватный метод, т.е. его нельзя вызывать вне класса.
        console.log('privateMethod:' + this.state + this.state);
    }
}

let first = new Singleton('first');
Singleton.instance = 0; // Попытка внести изменения в приватное свойство не сработает, оно инкапсулировано.
let second = new Singleton('second');
second.privateMethod(); // Попытка вызвать приватный метод не сработает. 
let third = new Singleton('3');

console.log(first === third);