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
- 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?
- C Cách tích hợp ChatGPT vào Google Search siêu dễ
- V VoiceGPT là gì? Giới thiệu tính năng và cách cài đặt sử dụng Voice GPT
- G GPT-4o Mini – Thông minh hơn và tiết kiệm hơn?
- C ChatGPT-4o là gì? Điểm mới của ChatGPT-4o vs ChatGPT-4
- C Chat GPT 4.0 là gì? Có gì vượt trội so với Chat GPT phiên bản cũ?
- C Cách tự học code web, tìm kiếm công việc dễ dàng và hạnh phúc mỗi ngày
- G Giới thiệu 15 website học và luyện hack hợp pháp
- T Tầm quan trọng của các chương trình đào tạo sau đại học trong kỷ nguyên 4.0