Lớp Singleton trong Java



Mục đích của Singleton là để kiểm soát việc tạo ra đối tượng, giới hạn số lượng đối tượng tạo ra là chỉ một. Giống như các trường static, chỉ có một trường Singleton xuất hiện cho mỗi lớp. Các Singleton thường kiểm soát sự truy cập tới nguồn như kết nối database hoặc socket.

Ví dụ, nếu bạn được phép có một kết nối tới database hoặc JDBC driver mà có vấn đề về đa luồng (multithreading), thì Singleton bảo đảm rằng chỉ có duy nhất một kết nối được tạo ra hoặc chỉ có một thread có thể truy cập kết nối đó tại một thời điểm.

Triển khai Singleton trong Java

Ví dụ 1

Sự triển khai đơn giản nhất gồm một private constructor và một trường để giữ kết quả, và một phương thức static accessor với tên như getInstance().

Trường private có thể được gán từ trong một khối khởi chạy tĩnh (static initializer), hoặc đơn giản hơn, bạn sử dụng một initializer. Phương thức getInstance() (mà phải là public) sau đó trả về instance này.

// TenFile: Singleton.java
public class Singleton {   private static Singleton singleton = new Singleton( );
   
   /* Mot private Constructor de ngan can bat cu 
    * lop nao khac khoi tao.
    */
   private Singleton(){ }
   
   /* Phuong thuc static 'instance' */
   public static Singleton getInstance( ) {
      return singleton;
   }
   /* Cac phuong thuc protected khac */
   protected static void demoMethod( ) {
      System.out.println("demoMethod cho singleton"); 
   }
}

Đây là file chứa chương trình chính, chúng ta sẽ tạo đối tượng singleton:

// TenFile: SingletonDemo.java
public class SingletonDemo {
   public static void main(String[] args) {
      Singleton tmp = Singleton.getInstance( );
      tmp.demoMethod( );
   }
}

Nó sẽ cho kết quả:

demoMethod for singleton

Ví dụ 2

Sự triển khai sau minh họa một mẫu thiết kế ClassicSingleton trong Java:

public class ClassicSingleton {   private static ClassicSingleton instance = null;
   protected ClassicSingleton() {
   }
   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}

Lớp ClassicSingleton duy trì một tham chiếu static tới singleton bơ vơ và trả về tham chiếu đó từ phương thức static getInstance().

Ở đây, lớp ClassicSingleton thuê một kỹ thuật, mà được biết đến như là lazy instantiation, để tạo singleton; kết quả là, singleton không được tạo tới khi phương thức getInstance() được gọi lần đầu tiên. Kỹ thuật này bảo đảm rằng các singleton chỉ được tạo khi cần thiết.



lop_va_doi_tuong_trong_java.jsp