Design pattern trong Java: Singleton

Khái niệm

Singleton là một design pattern thuộc loại Creation pattern(Khởi tạo) cho phép bạn đảm bảo rằng một class chỉ có một instance, đồng thời cung cấp một biến truy cập toàn cục cho instance này.

Bài toán?

Singleton Pattern giải quyết hai vấn đề cùng một lúc vi phạm nguyên tắc Single Responsibility:

  1. Đảm bảo rằng một class chỉ có một instance duy nhất. Tại sao mọi người lại muốn kiểm soát số lượng instance mà một class có? Lý do phổ biến nhất cho điều này là kiếm soát quyền truy cập vào một số tài nguyên được chia sẻ. Ví dụ: Cơ sở dữ liệu hoặc file,..
    Đây là các hoạt động: Hãy tưởng tượng bạn đã tạo ra một đối tượng, nhưng sau một thời gian, bạn quyết định tạo một đối tượng mới. Thay vì nhận một đối tượng mới, bạn sẽ nhận được một đối tượng mà bạn đã tạo.
    Lưu ý rằng hành vi này không thể thực hiện với một phương thức khởi tạo thông thường, vì phương thức khởi tạo phải luôn trả về một đối tượng mới theo thiết kế.


    Khách hàng thậm chí có thể không nhận ra rằng họ đang làm việc với cùng một đối tượng mọi lúc 
  2. Cung cấp một biến truy cập toàn cục cho instance đó. Hãy nhớ biến toàn cục đã sử dụng để lưu trữ một số đối tượng thiết yếu? Mặc dù chúng rất tiện dụng nhưng cũng rất không an toàn vì bất kì đoạn code nào cũng có khả năng ghi đè lên nội dung của các biến đó và làm hỏng ứng dụng.
    Cũng giống như biến toàn cục. Singleton design pattern cho phép bạn truy cập một số đối tượng từ bất kỳ đâu trong chương trình. Tuy nhiên, nó cũng bảo vệ instance đó không bị ghi đè.

Ngày nay, Singleton design pattern đã trở nên phổ biến đến mức mọi người có thể gọi một cái gì đó là singleton ngay cả khi nó chỉ giải quyết được một trong những vấn đề được liệt kê.

Giải pháp

Tất cả các Singleton được triển khai theo hai bước sau:

  1. Đặt phương thức khởi tạo mặc định là private, để ngăn các đối tượng khác khởi tạo class Singleton mới.
  2. Tạo một phương thức static hoạt động như một phương thức khởi tạo. Bên dưới, phương thức này gọi phương thức khởi tạo riêng để tạo một đối tượng và lưu nó trong một biến static. Tất cả các lệnh gọi sau đến phương thức này đều trả về đối tượng đã được lưu trong cache.

Nếu code của bạn có quyền truy cập vào class Singleton thì nó có thể gọi phương thức static của Singleton. Vì vậy, bất cứ khi nào phương thức đó được gọi, cùng một đối tượng luôn được trả về.

Kiến trúc

  1. Singleton class khai báo phương thức static getInstance trả về cùng một instance của class riêng của nó.
    Constructor của Singleton phải được private. Gọi phương thức getInstance là cách duy nhất để lấy đối tượng Singleton.

Áp dụng khi nào?

Sử dụng Singleton Design Pattern khi một class trong chương trình của bạn chỉ nên có một instance duy nhất có sẵn cho tất cả client. Ví dụ một đối tượng truy cập cơ sở dữ liệu, log,…

Sử dụng Singleton pattern khi bạn cần kiểm soát chặt chẽ hơn đối với biến toàn cục.

Cách triển khai

  1. Thêm một biến static vào class để lưu trữ Singleton instance.
  2. Khai báo một phương thức static để tạo Singleton class.
  3. Thực hiện “lazy initialization” bên trong phương thức static. Nó sẽ tạo đối tượng mới trong lần gọi đầu tiên và đưa nó bảo biến static. Phương thức phải luôn trả về biến static đó trong các lần gọi tiếp theo.
  4. Đặt hàm constructor của class đó ở chế độ private. Phương thức static vẫn có thể gọi  constructor, nhưng các class bên ngoài không thể gọi được đến constructor trong Singleton.
  5. Thay thế tất cả các lệnh khởi tạo qua constructor thành khởi tạo qua phương thức tĩnh của Singleton class.

Ưu và nhược điểm

  • Bạn có thể chắc chắn rằng một class chỉ có một instance duy nhất.
  • Bạn có một biến toàn cục của instance đó.
  • Đối tượng singleton chỉ được khởi tạo trong lần gọi đầu tiên
  • Vi phạm nguyên tắc Single Responsibility. Mô hình giải quyết được hai vấn đề tại thời điểm đó.
  • Pattern được yêu cầu xử lý đặc biệt trong môi trường đa luồng để nhiều luồng sẽ không tạo ra một đối tượng singleton nhiều lần.
  • Rất khó để unit test.

Demo

Các bạn có thể tham khảo demo Design pattern Singleton ở đây nhé

Như vậy là mình đã giới thiệu xong về Singleton Design Pattern. Đây là một pattern sẽ được hỏi khá nhiều trong các câu hỏi phỏng vấn của các công ty trong trình độ fresher, intern. Nếu có gì không hiểu thì đừng ngại comment phía dưới nhé. Chúc các bạn có ngày học tập hiệu quả, và đừng quên tham gia Group để trao đổi kiến thức nhiều hơn nhé.

5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x