Trang chủTác giảLiên hệ

Design Pattern: Singleton trong TypeScript

By Nguyễn Văn Vũ
Published in Web Programming
December 14, 2021
1 min read

##1. Intent Singleton thuộc nhóm creational design pattern để đảm bảo rằng một class chỉ tồn tại một instance duy nhất khi truy xuất ở mọi nơi. alt text ##2. Problem

  1. Đảm bảo một class có duy nhất một instance: Đôi khi trong một chương trình chúng ta không muốn tạo instance của class một cách bừa bãi. Thay vì tạo một instance hoàn toàn mới gấy tốn tài nguyên thì chúng ta sẽ dùng lại instance đã được tạo sẵn. Ví dụ, tạo một instance để kết nối database thì chỉ cần tạo 1 instanceshare cho mọi nơi.
  2. Truy cập từ mọi nơi: Nhiều khi các bạn nghĩ đến việc tạo một biến global để truy cập ở mọi nơi nhưng việc để truy cập và thay đổi giá trị như này đôi khi làm chương trình bị crash một cách khó kiểm soát. Và nó vi phạm tính bao đóng (encapsulation) trong OOP . Singleton sẽ ngăn chặn việc truy cập một cách không kiểm soát như này.

alt text Clients may not even realize that they’re working with the same object all the time.

##3. Implementation

Ok, xong phần khái niệm, bây giờ chúng ta đi vào ví dụ để hiểu rõ hơn. Để implementation bạn có thể sử dụng ở các ngôn ngữ khác nhau. Ở đây mình sẽ dùng Typescript.

  • Cài đặt nodejs: dùng node để chạy file .js
  • Để chạy được file typescript thì phải dùng Typescipt Complier để complie file .ts sang file .js và dung node để chạy. Ở đây mình sẽ dùng ts-node, nó sẽ thực hiện complie và chạy luôn với node.
  • Mình sẽ mô phỏng tạo một kết nối database và tạo folder như sau:

alt text

DBConnection.ts

alt text

main.ts

alt text

Ok, bây giờ chúng ta chạy thử, mình dùng npx để chạy ts-node mà không phải cài trên máy :

alt text

Như vậy, như chúng ta mong đợi, dbc1dbc2 cùng trỏ tới 1instance và in ra cùng một danh sách users

Như trên instance chỉ được tạo khi mà gọi hàm getInstance nên gọi là Lazy Initialization.

Bạn có thể khởi tạo ngay khi class được load, gọi là Eager initialization

alt text

Nhưng nhược điểm là instance được khởi tạo nhưng có thể không được dùng đến.

Trong Angular hoặc NestJs, cũng có triển khai pattern này.

Thank for reading!


Tags

TYPESCRIPT

Nguyễn Văn Vũ

Related Posts

Cách dùng từ khóa `readonly` trong class, type, interface của TypeScript
December 14, 2021
1 min
© 2021, All Rights Reserved.

Quick Links

Liên hệ quảng cáoThông tinLiên hệ

Social Media