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 đó.

Singleton pattern designKhách hàng thậm chí không biết rằng mình làm việc với cùng một object trong toàn bộ thời gian. Nguồn ảnh / Source: refactoring.guru

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

Singleton pattern design

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.

  Design pattern là gì? Tại sao nên sử dụng Design pattern?
  Giới thiệu Abstract Factory Pattern

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:

Xem thêm Việc làm tuyển ux ui hấp dẫn trên TopDev