Singleton design pattern – tất cả những điều cần biết
Bài viết được sự cho phép của tác giả Kiên Nguyễn
Quay lại với chuỗi bài design pattern ở Kieblog, hôm nay là Singleton Pattern. Singleton là một pattern khá quen thuộc, như là pattern vỡ lòng khi bước vào thế giới của Design Pattern.
Tuy nhiên, để nắm rõ và hiểu sâu Pattern này không dễ. Đơn cử như các câu hỏi:
- Singleton Pattern có cung cấp Global Access cho instance không?
- Trường hợp Multi Thread hay Concurrency, implement Singleton Pattern thế nào?
Tất cả sẽ có trong bài viết này. Viết dài vãi nồi!
1. Định nghĩa về Singleton Pattern
Định nghĩa thì nhàm chán, nhưng thử nhìn qua thì thấy từ Single. Đang FA mà nghe từ này thì thốn, nhưng pattern đọc vẫn phải đọc.
Singleton is a creational design pattern that lets you ensure that a class has only one instance, while providing a global access point to this instance
Singleton là pattern khởi tạo cho phép bạn đảm bảo rằng class chỉ có duy nhất một instance, trong khi vẫn cung cấp truy xuất toàn cục cho instance này.
Single này không phải độc thân, mà mỗi thằng sẽ có một instance duy nhất.
Nhưng nói Singleton Pattern chỉ giải quyết vấn đề only one instance là còn thiếu, nó còn cho phép cái instance đó được phép global access nữa
2. Solve two problems
Singleton pattern giải quyết 2 vấn đề. Mà thực chất hai vấn đề này vi phạm Single Responsibility Principle. Vi phạm như thế nào sẽ đề cập sau ở phần advantages và disadvantages.
2.1 Ensure that a class has just a single instance
Đầu tiên cũng là quan trọng nhất, rõ ràng Singleton Pattern đảm bảo rằng class chỉ có một instance.
imagine that you created an object, but after a while decided to create a new one. Instead of receiving a fresh object, you’ll get the one you already created.
Tưởng tượng rằng bạn tạo một object, nhưng sau khi tạo lại muốn tạo thêm cái mới. Thay vì nhận được một object mới, bạn nhật được một object đã được tạo từ trước đó.
Chính vì có thể tái sử dụng, không cần lúc nào cũng phải new instance mới, ta có thể dùng Singleton Pattern để đảm bảo rằng chỉ một instance duy nhất được tạo ra.
2.2 Provide a global access point to that instance
Giống như biến toàn cục (Global variable). Singleton pattern cung cấp Global Access cho instance mà nó tạo ra. Ở đâu cần instance đều có thể truy cập được, một hình thức như tái sử dụng.
Đấy, toàn bộ nội dung về thằng Singleton Pattern thì chỉ có vậy. Còn hiện thực ra sao mời anh em tới bước tiếp theo. Source tạm thời viết java ha.
3. Hiện thực thế nào?
// Singleton pattern public final class Singleton { private static Singleton instance; public String value; private Singleton(String value) { // Following code emulates slow initialization. try { Thread.sleep(1000); } catch (InterruptedException ex) { ex.printStackTrace(); } this.value = value; } public static Singleton getInstance(String value) { // Nếu chưa có instance thì new, có rồi thì return cái cũ if (instance == null) { instance = new Singleton(value); } return instance; } }
Tuy nhiên cũng cần chú ý là trường hợp Multi Thread hoặc Concurrency, tránh Deadlock
// Singleton pattern for thread safe implement public final class Singleton { private static volatile Singleton instance; public String value; private Singleton(String value) { this.value = value; } public static Singleton getInstance(String value) { if (instance == null) { // Sử dụng synchronized để đảm bảo class Singleton chưa bị block bởi thread khác synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(value); } } } return instance; } }
4. Advantages and disadvantages
- Ưu: You can be sure that a class has only a single instance. Chắc chắn là class chỉ có một instance duy nhất.
- Ưu: You gain a global access point to that instance. Gán được global acess cho instance đó.
- Ưu: The singleton object is initialized only when it’s requested for the firsttime. Singleton object chỉ khởi tạo một lần duy nhất khi được request tới.
Đấy, ưu điểm có nhiều, tuy nhiên nhược điểm cũng có.
Đầu tiên là cái vi phạm Single Responsibility Principle. Cái thằng SRP này.
The Single Responsibility Principle (SRP) states that a class should have one and only one responsibility. A Singleton, by it’s very nature, has at least two responsibilities.
Trạng thía SRP hiểu rằng class nên chỉ nên có duy nhất một nhiệm vụ duy nhất. Class do only one thing. Đối với singleton pattern, một object phải kiêm nhiệm nhiều nhiệm vụ, ông nào gọi cũng phải chạy tới.
Ngoài ra, nếu lập trình đa luồng (Multi Thread) hoặc Concurrency, một singleton có thể bị giữ bởi một thread, các thread khác không thể access. Dẫn tới deadlock.
Bài viết gốc được đăng tải tại kieblog.vn
Có thể bạn quan tâm:
- Để làm lập trình viên sau 1 năm, nên học gì?
- Giới thiệu Singleton Pattern
- Expressjs là gì? Tất tần tật về Express.js
Xem thêm Việc làm tuyển ux ui hấp dẫn trên TopDev
- B BenQ RD Series – Dòng Màn Hình Lập Trình 4k+ Đầu Tiên Trên Thế Giới
- i iOS 18 có gì mới? Có nên cập nhật iOS 18 cho iPhone của bạn?
- G Gamma AI là gì? Cách tạo slide chuyên nghiệp chỉ trong vài phút
- P Power BI là gì? Vì sao doanh nghiệp nên sử dụng PBI?
- K KICC HCMC x TOPDEV – Bước đệm nâng tầm sự nghiệp cho nhân tài IT Việt Nam
- T Trello là gì? Cách sử dụng Trello để quản lý công việc
- T TOP 10 SỰ KIỆN CÔNG NGHỆ THƯỜNG NIÊN KHÔNG NÊN BỎ LỠ
- T Tìm hiểu Laptop AI – So sánh Laptop AI với Laptop thường
- M MySQL vs MS SQL Server: Phân biệt hai RDBMS phổ biến nhất
- S SearchGPT là gì? Công cụ tìm kiếm mới có thể đánh bại Google?