From c0675062189817803e3b33b251ef61855e574b80 Mon Sep 17 00:00:00 2001 From: artyomtrubchik Date: Thu, 29 Feb 2024 03:01:08 +0300 Subject: [PATCH] patch singleton (#5177) --- tools/design-patterns-creational/index.md | 25 ++++++++++------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/tools/design-patterns-creational/index.md b/tools/design-patterns-creational/index.md index b636a22e27..681564021c 100644 --- a/tools/design-patterns-creational/index.md +++ b/tools/design-patterns-creational/index.md @@ -364,23 +364,22 @@ addMilk = () => { Допустим, мы пишем приложение для описания Солнечной системы. Солнце у нас может быть только одно, поэтому создать его тоже можно лишь один раз. -Если по каким-то причинам в приложении есть код, пытающийся создать Солнце заново, то стоит использовать уже существующий объект, а не создавать ещё один. +Если по каким-то причинам в приложении есть код, пытающийся создать Солнце заново, то наш класс будет возвращать существующий объект, а не создавать ещё один. ```js class Sun { // Держим ссылку на созданный объект: - static instance = null + static #instance = null // Делаем конструктор приватным: - #constructor() {} - - static get instance() { + constructor() { // Если объект был создан ранее, возвращаем его: - if (this.instance) return this.instance + if (Sun.#instance) { + return Sun.#instance + } - // Иначе создаём новый экземпляр: - this.instance = new this() - return this.instance + // Иначе присваиваем объекту текущее значение this: + Sun.#instance = this } } ``` @@ -389,12 +388,12 @@ class Sun { ```js // При первом вызове создастся новый объект: -const sun = Sun.instance +const sun = new Sun() // В дальнейшем instance будет возвращать // ранее созданный объект: -const sun1 = Sun.instance -const sun2 = Sun.instance +const sun1 = new Sun() +const sun2 = new Sun() console.log(sun === sun1) // true @@ -402,8 +401,6 @@ console.log(sun === sun2) // true ``` -Важно, что нам приходится прятать конструктор от внешнего мира, чтобы нельзя было создать новый экземпляр класса извне. И в целом код синглтона выглядит не очень опрятным. - ### Когда использовать Когда требуется обеспечить строго один экземпляр объекта на всё приложение. Чаще всего это не нужно.