Thứ Sáu, 28 tháng 12, 2018

Singleton Pattern

Singleton Patern, một pattern supper thú vị sắp được giới thiệu với bạn đây. Tại sao lại thú vị ư? Để mình nói cho bạn nghe nhé: singleton pattern có hàm constructor là private. Nhớ nhé, private đấy! Không phải public đâu. Vậy tại sao lại là private, chúng ta phải đến với tình huống cụ thể mới biết hiểu được nhé.
Okie, giả dụ bạn là một nhà lập trình trang web gạ "cờ hịch" online. Những người nào muốn được cờ hịch free thì sẽ lên trang web của bạn tìm đối tượng. Vậy đầu tiên chúng ta sẽ phải có 1 cái gì nhỉ? À, chúng ta phải có 1 cái room chát tổng, để cho những con trống vào gạ gẫm những con mái, hoặc con trống gạ con trống ._.. Nói chung là ko quan trọng, quan trọng là chúng ta phải có 1 cái room chat tổng để tất cả mọi người cùng vào. Và trang web của chúng ta có rất nhiều theme nhé, có theme hồng cánh sen cho mấy chị bánh bèo, có theme đen mạnh mẽ cho mấy anh 6 múi.... Nhưng dù ở theme nào đi nữa, chúng ta cũng chỉ sử dụng chung 1 cái room chat duy nhất mà thôi, đó là room chat tổng.
Vậy làm sao để từ 1 class room chat, chúng ta chỉ có thể tạo 1 đối tượng room chat duy nhất, mà không thể tạo ra 1 cái room chat thứ 2. Nghe có vẻ khoai đúng ko? Nếu đã là 1 lớp, thì chúng ta làm quái nào mà ngăn người ta tạo ra nhiều hơn 1 thực thể được. Và đây chính là lúc Singleton Pattern được sử dụng.
Singleton Pattern: đảm bảo rằng 1 lớp chỉ có 1 thực thể duy nhất và cho phép ta truy cập ở cấp độ toàn cục
Tức là sao? Tức là: chúng ta có 1 class A nào đó chẳng hạn, thì nếu thiết kế theo singleton pattern, chúng ta không thể nào tạo ra được 2 thực thể khác nhau của A. Nghe có vẻ lạ đúng không, nhưng điều này là hoàn toàn có thể. Bằng cách nào? Haha, đây là lúc bạn nhìn thấy private constructor. Nghe thôi đã thấy hài vl =)) Cấu trúc của 1 singleton pattern.
1 class A thiết kế theo của singleton pattern, sẽ có 1 biến static có kiểu A, 1 hàm constructor private, và 1 hàm createSingleton static. Vì constructor là private, nên chúng ta không thể tạo thực thể cho class bằng lệnh new A(); được, mà thay vào đó, chúng ta sẽ phải dùng hàm createSingleton để khởi tạo 1 thực thể. Và tất nhiên, trong hàm createSingleton này, chúng ta sẽ trả về 1 biến static duy nhất. Điều này ngăn cản việc khởi tạo 2 thực thể khác nhau của 1 lớp.
OK! Vào code để xem thằng singleton này nó được code như nào xem nào. Đầu tiên là khởi tạo 1 lớp ChatRoom, với thiết kế của singleton như trên.
public class ChatRoom {
   private static ChatRoom chatRoom;
   private ChatRoom() {
   }
   public static ChatRoom createChatRoom(){
   
   }
}
Bây h ta chỉ cần viết logic cho createChatRoom là xong.
public class ChatRoom {
   private static ChatRoom chatRoom;
   private ChatRoom() {
   }
   public static ChatRoom createChatRoom(){
       if(chatRoom == null) {
           chatRoom = new ChatRoom();
       }
       return chatRoom;
   }
}
Vậy là xong. Nếu bạn muốn khởi tạo 1 ChatRoom thì chỉ cần.
ChatRoom chatRoom = ChatRoom.createChatRoom();
Lần thứ 2 bạn khởi tạo ChatRoom bằng câu lệnh trên, thì nó vẫn trả về cho bạn đúng 1 thực thể duy nhất. Và đó chính là Singleton Pattern. Chúc trang web gạ cờ hịch của bạn không bị công an bắt và kiếm được nhiều tiền nhé!
Share:

0 nhận xét:

Đăng nhận xét

Được tạo bởi Blogger.