This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

Singleton in single-threading environment

how should we implement? (C++, Java)
Added by bronzeboyvn almost 3 years ago  »  Votes: 1/1

Singleton là thuật ngữ chỉ một class được thiết kế sao cho ta dùng chỉ một instance của class đó. Ứng dụng phổ biến nhất của singleton là thiết kế class Logger, các bạn có thể tham khảo tại yolinux .
Bài viết này đề cập tới tính chất: Lazy initialization, tức là ta chỉ khởi tạo instance khi dùng tới.
Những mẫu thiết kế sau đây không được khuyến khích:

Java (không nên)

1 public class Singleton {
2   private static Singleton instance = new Singleton();
3   private Singleton() {}
4   public static Singleton getInstance() {
5     return instance;
6   }
7 }

C++ (không nên)

 1 // Header file (.h)
 2 
 3 class Singleton
 4 {
 5 private:
 6   static Singleton instance;
 7   Singleton();
 8   ~Singleton() {}
 9   Singleton(const Singleton &);
10   Singleton & operator=(const Singleton &);
11 public:
12   static Singleton &getInstance();
13 };
14 
15 // Source file (.cpp)
16 
17 Singleton Singleton::instance;
18 
19 Singleton &Singleton::getInstance()
20 {
21   return instance;
22 }

Khi cần truy cập tới instance (duy nhất) của class Singleton, ta gọi hàm getInstance(). Ở 2 ví dụ trên, khi ta chưa gọi hàm này, thì instance đã được khởi tạo. Những mẫu sau đây được khuyến khích:

Java (nên)

 1 public class Singleton {
 2   private static Singleton instance = null;
 3   private Singleton() {}
 4   public static Singleton getInstance() {
 5     if (instance == null)
 6       instance = new Singleton();
 7     return instance;
 8   }
 9 }

C++ có 2 mẫu

(nên.1) : với cách thiết kế này ta có thể tạo class con DerivedSingleton, thừa kế từ class cha Singleton.

 1 // Header file (.h)
 2 
 3 class Singleton
 4 {
 5 public:
 6     static Singleton &getInstance();
 7 protected:
 8     Singleton();
 9 private:
10     static Singleton* instance;
11 };
12 
13 // Source file (.cpp)
14 
15 Singleton* Singleton::instance = NULL;
16 
17 Singleton &Singleton::getInstance ()
18 {
19     if (instance == NULL) {
20         instance = new Singleton();
21     }
22     return *instance;
23 } 

(nên.2) : với cách thiết kế này ta không thể tạo class con DerivedSingleton, thừa kế từ class cha Singleton.

 1 // Header file (.h)
 2 
 3 class Singleton
 4 {
 5 public:
 6   static Singleton &getInstance();  
 7 private:
 8   Singleton() {}
 9   ~Singleton() {}
10   Singleton(const Singleton &);
11   Singleton & operator=(const Singleton &);
12 };
13 
14 // Source file (.cpp)
15 
16 Singleton &Singleton::getInstance ()
17 {
18     static Singleton instance;
19     return instance;
20 }

Như vậy mới đúng là singleton, instance được khởi tạo ở lần đầu tiên gọi hàm getInstance().
Hẹn gặp ở bài kế tiếp, Singleton in multi-threading environment .


Comments

Added by hoangtran almost 3 years ago

Biết vụ tiếp theo là gì rồi nhé :-D

Added by almost 3 years ago

Trong Ruby thì singleton có khác đôi chút và các ứng dụng cũng lắm :) Để mình sẽ dịch lại một bài chia sẻ với các bạn :P