
Module Pattern và Singleton Pattern trong JavaScript
Table Of Content
JavaScript là một ngôn ngữ lập trình linh hoạt và mạnh mẽ, đặc biệt trong việc quản lý mô-đun và các mẫu thiết kế (design patterns). Hai trong số các mẫu thiết kế phổ biến nhất trong JavaScript là Module Pattern và Singleton Pattern. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về hai mẫu thiết kế này, cách sử dụng chúng, ưu điểm, nhược điểm, và các ví dụ thực tế.
1. Module Pattern
Giới thiệu
Module Pattern là một mẫu thiết kế phổ biến giúp tổ chức mã JavaScript thành các mô-đun có thể tái sử dụng. Nó giúp giảm xung đột tên (namespace pollution) bằng cách tạo ra một không gian riêng biệt cho từng mô-đun.
Cách hoạt động
Module Pattern sử dụng IIFE (Immediately Invoked Function Expression) để tạo một phạm vi riêng tư và chỉ cung cấp các phương thức hoặc biến cần thiết ra ngoài.
Cấu trúc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
const MyModule = (function () { // Biến và hàm private let privateVariable = "I am private"; function privateMethod() { console.log("This is a private method"); } return { // Biến và hàm public publicMethod: function () { console.log("This is a public method"); console.log(privateVariable); } }; })(); MyModule.publicMethod(); // Truy cập được // MyModule.privateMethod(); // Không truy cập được (lỗi) |
Ưu điểm
- Encapsulation: Giữ các biến và hàm private giúp tránh xung đột.
- Tổ chức tốt hơn: Giúp quản lý mã dễ dàng hơn.
- Tránh ô nhiễm namespace: Giữ không gian tên sạch sẽ.
Nhược điểm
- Không linh hoạt khi mở rộng: Nếu cần thay đổi chức năng, bạn phải sửa trực tiếp trong mô-đun.
- Không thể kế thừa hoặc ghi đè: Không hỗ trợ kế thừa dễ dàng như các class trong ES6.
2. Singleton Pattern
Giới thiệu
Singleton Pattern đảm bảo rằng một class chỉ có duy nhất một instance trong suốt vòng đời của ứng dụng. Đây là mẫu thiết kế hữu ích khi bạn muốn quản lý trạng thái toàn cục.
Cách hoạt động
Singleton hoạt động bằng cách kiểm tra xem instance đã tồn tại hay chưa. Nếu đã có instance, nó sẽ trả về instance đó thay vì tạo một instance mới.
Cấu trúc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const Singleton = (function () { let instance; function createInstance() { const object = new Object("I am the instance"); return object; } return { getInstance: function () { if (!instance) { instance = createInstance(); } return instance; } }; })(); const instance1 = Singleton.getInstance(); const instance2 = Singleton.getInstance(); console.log(instance1 === instance2); // true |
Ưu điểm
- Tiết kiệm bộ nhớ: Tránh việc tạo nhiều instance không cần thiết.
- Quản lý trạng thái: Giữ trạng thái của ứng dụng nhất quán.
- Dễ dàng truy cập: Có thể truy cập từ bất kỳ đâu trong ứng dụng.
Nhược điểm
- Khó kiểm tra (Testing): Singleton có thể gây khó khăn trong việc kiểm tra đơn vị (unit test) do phụ thuộc vào instance toàn cục.
- Có thể gây vấn đề về đồng bộ: Nếu nhiều phần của ứng dụng thay đổi dữ liệu cùng lúc, cần đảm bảo tính đồng bộ.
3. So sánh Module Pattern và Singleton Pattern
Tiêu chí | Module Pattern | Singleton Pattern |
---|---|---|
Cách hoạt động | Dùng IIFE để tạo module riêng biệt | Dùng một biến để lưu instance duy nhất |
Phạm vi | Encapsulation, tránh ô nhiễm namespace | Chia sẻ trạng thái toàn cục |
Tái sử dụng | Dễ tái sử dụng vì có thể định nghĩa nhiều module | Không thể tạo nhiều instance |
Tính linh hoạt | Khó mở rộng | Có thể mở rộng bằng cách sửa đổi instance |
Ứng dụng thực tế | Tổ chức mã sạch sẽ, tránh xung đột tên | Quản lý cấu hình, cache dữ liệu |
4. Khi nào sử dụng?
- Dùng Module Pattern khi:
- Cần tạo các module độc lập.
- Muốn bảo vệ biến và hàm private.
- Tránh xung đột namespace trong dự án lớn.
- Dùng Singleton Pattern khi:
- Cần một instance duy nhất để quản lý trạng thái.
- Muốn tối ưu tài nguyên (cache, cấu hình, API service, v.v.).
- Cần quản lý truy cập dữ liệu tập trung.
5. Kết luận
Module Pattern và Singleton Pattern là hai mẫu thiết kế quan trọng trong JavaScript, mỗi cái có ưu điểm và nhược điểm riêng. Nếu bạn cần tổ chức mã một cách gọn gàng và tránh xung đột, hãy sử dụng Module Pattern. Nếu bạn cần một instance duy nhất để quản lý trạng thái toàn cục, Singleton Pattern sẽ là lựa chọn tốt hơn.
Hy vọng bài viết này giúp bạn hiểu rõ hơn về hai mẫu thiết kế quan trọng này và có thể áp dụng chúng vào dự án của mình một cách hiệu quả!
No Comment! Be the first one.