Singleton Pattern - Java

Singleton pattern là gì?

Singleton pattern là một design pattern thuộc nhóm cấu trúc. Nó cho phép bạn đảm bảo rằng một class chỉ có duy nhất 1 instance trong toàn bộ chương trình và cung cấp 1 điểm truy cập cục bộ tới chính nó. Instance này còn có tính chất lazy initialization - tức là chương trình chỉ tạo ra instance này khi nó được gọi đến.
Singleton được dùng nhiều trong logging, caching và thread pool

Những trường hợp nào thì chúng ta nên dùng singleton pattern

  1. Đảm bảo rằng 1 class chỉ có duy nhất 1 instance

    Tại sao chúng ta cần quan tâm số lượng instance mà 1 class có? Tình huống thường gặp nhất là để kiểm soát việc truy cập dữ liệu (database hoặc file).
  2. Cung cấp 1 điểm truy cập cục bộ tới instance đó

    Khi mà bạn muốn lưu trữ những biến cục bộ, bạn sẽ không muốn bất kỳ đoạn code nào đó trong chương trình vô tình thay đổi giá trị của chúng.

Cấu trúc

Singleton class sẽ khai báo 1 static function getInstance() để kiểm soát việc khởi tạo instance và 1 biến instance để chứa chính instance của class đó. Constructor nên được ẩn đi để client chỉ có thể tạo instance của class đó duy nhất qua phương thức getInstance()

Ví dụ Java singleton pattern

Có khá nhiều cách để implement singleton trong Java từ non-thread safe cho tới thread safe
  1. Eager initialization
  2. Static block initialization
  3. Lazy initialization
  4. Thread Safe Singleton
  5. Bill Pugh Singleton implementation
  6. Enum Singleton
  7. Serialization and Singleton

Eager initialization

Static block initialization

Lazy initialization

Cách implement này có tên gọi lazy initialization là bởi vì nó chỉ khởi tạo object singleton khi client gọi tới hàm getInstance.

Thread Safe Singleton

Đây là cách implement thread safe double check cho singleton. Nó đảm bảo 2 threads sẽ không bao giờ tạo ra 2 objects singleton

Bill Pugh Singleton implementation

Cách implement này dùng nested class để giữ instance của outer class

Enum Singleton

Về bản chất thì enum được khởi tạo bởi 1 thread và chỉ 1 lần duy nhất nên chúng ta có thể implement singleton bằng enum

Serialization and Singleton

Để implement serialization với single, chúng ta cần đảm bảo lúc desirialize object vẫn chỉ trả về 1 object duy nhất

Source code trong bài viết: https://github.com/luubi/design-patterns/tree/master/src/main/java/com/vlt/singleton

Nguồn: Bài viết liên quan:

Bài viết liên quan


EmoticonEmoticon