Singleton class, nó là gì ?
Bạn đã nghe thấy thuật ngữ Singleton class ? Đó là 1 class mà trong toàn bộ chương trình chúng ta chỉ có thể tạo 1 "instance" ( thực thể ) duy nhất của nó.
Với bài viết này, tôi mong các bạn có 1 cái nhìn tổng quan về Singleton class, và cách cài đặt nó trong Java và C++.
Đầu tiên là về ý tưởng.
Đối với Singleton class, thì chương trình chỉ được phép tạo 1 instance duy nhất của nó, vì vậy
- Constructor của class là private
- Class phải có reference ( tham chiếu ) đến cái instance duy nhất đó, tức là chúng ta dùng 1 tham chiếu tới class = 1 biến static
- Do ko có constructor public, nên ta cần có 1 phương thức để khởi tạo class.
Đó là các yêu cầu dành cho Java.
Giả sử chúng ta xây dựng 1 class SingleTon trong Java.
Đúng tinh thần phải có 1 tham chiếu đến thực thể duy nhất, ta tạo 1 biến static. Và đương nhiên là 1 constructor thuộc tính private. Trong constructor này bạn cài đặt như bạn muốn.
1 2 3 4 | public class SingleTon { private static SingleTon _singleRef = new SingleTon(); private SingleTon() {}; } |
Tiếp theo là 1 hàm getInstance để lấy địa chỉ của thực thể của class đó.
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class SingleTon { private static SingleTon _singleRef = new SingleTon(); private SingleTon() {}; public static SingleTon getInstance() { if ( _singleRef == null ) { _singleRef = new SingleTon(); } return _singleRef; } public void sayHello () { System.out.println("Hello! I'm the one!"); } } |
Giải thích: nếu tham chiếu chưa chỉ đến vùng nhớ nào, thì ta tạo 1 thực thể mới ( thực ra việc này để đảm bảo rằng instance luôn có ). Nếu nó đã trỏ đến 1 vùng nhớ thì ta trả giá trị vùng nhớ.
Sử dụng nó thế nào ? Có 2 cách
1. Tạo class trỏ đến vùng nhớ
1 2 3 4 5 | public static void main(String[] args) { SingleTon obj = SingleTon.getInstance(); if ( obj == null ) System.err.println("Cannot creat instance"); obj.sayHello(); } |
2. Sử dụng trực tiếp không qua khai báo
1 2 3 | public static void main(String[] args) { SingleTon.getInstance().sayHello(); } |
Đây là toàn bộ cài đặt dành cho Java, cài đặt cho C++ có 1 vài cái khác phức tạp hơn mà tôi sẽ trình bày ở trang sau
Comments