Skip to content

Commit

Permalink
patch singleton (#5177)
Browse files Browse the repository at this point in the history
  • Loading branch information
artyomtrubchik authored Feb 29, 2024
1 parent b2bed4e commit c067506
Showing 1 changed file with 11 additions and 14 deletions.
25 changes: 11 additions & 14 deletions tools/design-patterns-creational/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
```
Expand All @@ -389,21 +388,19 @@ 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
console.log(sun === sun2)
// true
```

Важно, что нам приходится прятать конструктор от внешнего мира, чтобы нельзя было создать новый экземпляр класса извне. И в целом код синглтона выглядит не очень опрятным.

### Когда использовать

Когда требуется обеспечить строго один экземпляр объекта на всё приложение. Чаще всего это не нужно.
Expand Down

0 comments on commit c067506

Please sign in to comment.