I.Creational Pattern

1.Singleton

Mẫu Singleton đảm bảo một lớp chỉ có tối đa một thể hiện(instance) được tạo ra và cung cấp điểm truy cập global. Đôi khi trong vòng đời của ứng dụng, chúng ta chỉ cần một thể hiện của một lớp, chẳng hạn như chúng ta chỉ cần một đối tượng kết nối database trong một ứng dụng. Trong trường hợp này, mẫu Singleton thực sự hữu ích bởi vì nó đảm bảo rằng chỉ tồn tại 1 và chỉ 1 instance của một đối tượng cụ thể nào đó. Hơn nữa, nó còn cho thấy các đối tượng client có thể truy cập vào instance này một cách nhất quán. Bên cạnh đó, nó ngăn cản các đối tượng client tạo ra các instance mới từ lớp đó.

Mục đích

  • Tạo ra một instance của một lớp.
  • Cung cấp một điểm truy cập global vào đối tượng.

Thực thi

Trong đó:

Singleton: cung cấp một Constructor private, duy trì một tham chiếu private static đến instance đơn của lớp, đồng thời nó cung cấp phương thức static để trả về một tham chiếu đến instance đơn đó.

Code mẫu

//Early instantiation using implementation with static field.

class Singleton
{

private static Singleton m_instance = new Singleton();

private Singleton()
{
System.out.println(“Singleton(): Initializing Instance”);
}

public static Singleton getInstance()
{
return m_instance;
}

public void doSomething()
{
System.out.println(“doSomething(): Singleton does something!”);
}

}

Hay sử dụng cho multithread

//Lazy instantiation using double locking mechanism.
class Singleton
{

private static Singleton m_instance;

private Singleton()
{

System.out.println(“Singleton(): Initializing Instance”);

}

public static Singleton getInstance()
{

if (m_instance == null)
{

synchronized(Singleton.class)
{

if (m_instance == null)
{
System.out.println(“getInstance(): First time getInstance was invoked!”);
m_instance = new Singleton();
}

}

}

return m_instance;

}

public void doSomething()
{

System.out.println(“doSomething(): Singleton does something!”);

}
}

Lợi ích và hạn chế

  • Singleton là lớp chỉ có thể tạo ra một instance của chính nó. Bạn không thể tạo ra nó mà không dùng phương thức static được cung cấp.
  • Bạn không cần phải gán tham chiếu cho tất cả các đối tượng cần Singleton này.
  • Tuy nhiên, mẫu Singleton cũng có thể gặp vấn đề với thread, và nó phụ thuộc vào phần thực thi(hay cài đặt). Bạn phải cẩn thận trong các ứng dụng multithread, nếu ko có cơ chế kiểm soát thích hợp, rất có thể sẽ xảy ra xung đột giữa các thread.

Các biến thể của Singleton

Có nhiều instance trong Singleton. Lợi ích ở đây là phần còn lại của ứng dụng vẫn như cũ, trong khi các instance khác được sử dụng các phương thức khác để nhận các instance khác.

Nếu Singleton thực thi giao diện Serializable, thì chúng phải thực thi phương thức readResolve() để tránh tạo ra 2 đối tượng khác nhau. Ví dụ như:

public class Singleton implements Serializable {

// This method is called immediately after an object of this class is deserialized.
// This method returns the singleton instance.
protected Object readResolve() {

return getInstance();

}
}

Bạn thấy bài viết này thế nào?

Các bài viết liên quan:
Design Patterns trong Java – Phần 1
Design Patterns trong Java – Phần 3