---
description: >-
  https://app.gitbook.com/@javascriptuse/s/advanced/design-pattern-trong-javascript
---

# Singleton Pattern javascript (ok)

`Singleton` là một object chỉ khởi tạo duy nhất một lần, nghĩa là nó chỉ tạo một instance mới của một class nếu chưa tồn tại instance nào, còn nếu có thì nó chỉ việc trả lại instance đó. Nhờ vậy mà dù có gọi hàm khởi tạo nhiều lần thì chúng ta cũng chỉ nhận được một object duy nhất, giúp tránh lãng phí bộ nhớ.

JavaScript đã xây dựng sẵn `singleton` như là một tính năng, được gọi là `object literal`. Ví dụ:

```
const user = {
    name: 'Peter',
    age: 25,
    job: 'Teachcer',
    greet: function() {
        console.log('Hello!');
    }
}
```

Bởi vì mỗi object trong JavaScript chiếm một vùng trong bộ nhớ và khi gọi tới object `user`, chúng ta nhận được một tham chiếu tới nó. Nếu thử gán biến `user` vào một biến khác và thay đổi biến đó. Ví dụ:

```
const user1 = user;
user1.name = 'Mark';
```

Điều này làm thay đổi cả 2 object bởi vì JavaScript truyền tham chiếu chứ không phải truyền giá trị. Vậy nên vẫn chỉ có duy nhất một object trong bộ nhớ:

```
// prints 'Mark'
console.log(user.name);

// prints 'Mark'
console.log(user1.name);

// print true
console.log(user === user1);
```

Chúng ta cũng có thể implement `Singleton` bằng `Module pattern`. Ví dụ:

```
const singleton = (function() {
    let instance;
    
    function init() {
        return {
            name: 'Peter',
            age: 24,
        }
    };
    
    return {
        getInstance: function() {
            if(!instance) {
                instance = init();
            }
            
            return instance;
        }
    }
})();
```

Trong đoạn code trên, chúng ta tạo một instance mới bằng cách gọi hàm `singleton.getInstance`. Nếu một instance đã tồn tại, hàm này đơn giản chỉ trả về instance đó, nếu instance chưa tồn tại, nó tạo một instance mới bằng hàm `init()`
