Saturday, August 24, 2013

Design Pattern - Singleton

Mẫu thiết kế singleton:
Nó là gì?
Mẫu thiết kế singleton đảm bảo chỉ duy nhất môt thực thể của một class được tạo ra và nó sẽ cung cấp cho bạn một phương thức để truy cập đến thực thế đó.
Kiểm soát việc tạo ra các thực thể nhưng có thể lấy ra thực thế.
Dùng nó trong trường hợp nào?
Khi bạn tạo ra một class mà bạn chỉ muốn chỉ có duy nhất một thực thể là thể hiện của class đó và bạn có thể truy cập đến nó ở bất kỳ nơi đâu khi bạn muốn.
Ví dụ như : Khi bạn tạo ra một class làm việc với file, config ,class lưu collection dùng chung, hoặc database . Bản chỉ cần duy nhất một thực thể của class đó và bạn sẽ sử dụng nó ở bất kỳ nơi đâu.
Dùng nó như thế nào?
Đầu tiên tôi tạo ra một class với tên là Database. Để không class nào có thể khỏi tạo nó (đảm bảo duy nhất có một thực thể) tôi sẽ private contructor của class trên.

  1. public class Database{
       private Database();
    }
Và tạo một thuộc tính có tên là INSTANCE có kiểu Database  và một phương trả về thuộc tính đó. Để các class khác có thể sử dụng phương thức này, tôi thêm từ khóa static để biến phương thức này thành phương thức của lớp.
  1. private Database INSTANCE;
  2. public static Database getInstance(){
  3.    if(INSTANCE == null){
  4.       INSTANCE = new Database();
  5.    }
  6.    return INSTANCE;
  7. }
Như trên tôi kiểm tra xem INSTANCE có bằng null hay không. Nếu bằng null thì tôi tạo một đối tượng. Và trả về INSTANCE.
Có một vấn đề xảy ra. Nếu có hai luồng (thread) chạy song song và thực hiện hàm if thì sẽ có 2 thực thể được tạo ra. Để tránh trường hợp này mình thêm từ khóa synchronized. Khi hàm getInstance đã được chạy thì bất kỳ các luồng khác phải đợi hàm này chạy xong mới gọi được.

  1. public static synchronized Database getInstance(){
  2.    if(INSTANCE == null){
  3.      INSTANCE = new Database();
  4.    }
  5.    return INSTANCE;
  6. }
Ok đến đây đã khá ổn nhưng sử dụng từ khóa synchronized đồng nghĩa với việc các luồng có thể phải đợi chờ lâu vì phải đợi luồng đang gọi hạm getInstance chạy xong mới gọi được. Để tránh trường hợp này, tôi sẽ tạo 1 thực thể của lớp Database ngày khi class này được sử dụng, và sử dụng từ khóa final để ngăn không cho thay đổi đối tượng mà INSTANCE trỏ đến  :

  1. private static final Database INSTANCE = new Database();
Lúc này hàm getInstance sẽ trả về đối tượng INSTANCE:
  1. public static Database getInstance(){
  2.    return INSTANCE;
  3. }

Để truy cập đến thực thể của class Database bạn thực hiện : Database.getInstance() lúc này trả về 1 thực thể có kiểu Database.

OK ! Đến đây bạn có thể chắc chắn rằng sẽ chỉ có duy nhất một thực thể của class Database được tạo ra và bạn có thể sử dụng hàm getInstance để truy cập vào thực thế đó. Việc còn lại là bạn viết các phương thức, các setter, getter cho nó. Đây chính là mẫu thiết kế singleton.

13 comments:

  1. thiếu kìa bạn.
    dòng private Database INSTANCE;
    phải là private static Database INSTANCE;

    ReplyDelete
  2. Bài viết dễ hiểu và hay! Cảm ơn tác giả! :v

    ReplyDelete
  3. I have received a bunch of information.This is very educational content and written well for a change.Cheers for sharing with us your wonderful blog.
    Discount master app, Discount master by autoketing, autoketing.com

    ReplyDelete
  4. I would like to thank you for the efforts you have made in writing this article.Love to read it,Waiting For More new Update and I Already Read your Recent Post its Great Thanks.
    facebook support chat facebook messenger online, autoketing app

    ReplyDelete
  5. apps autoketing
    shipping bar shopify
    App Shipping Bar Master
    I’m truly enjoying the design and layout of your site. It’s a very easy on the eyes which makes it much more enjoyable for me to come here and visit more often. Did you hire out a designer to create your theme? Great work!

    ReplyDelete
  6. Nice post. I learn something new and challenging on blogs I stumbleupon on a daily basis. It’s always exciting to read articles from other authors and practice something from other sites.
    autoketing.com
    email app download
    email with love by autoketing

    ReplyDelete
  7. I just right now wished to let you know about how exactly significantly I actually value all things you have discussed to help enhance life of individuals on this material. Using your articles, I have long gone by means of merely a beginner to a professional in your community. It is really a homage for your initiatives. Thank you
    Fortnite Building Simulator GamePlay
    Happy Wheels Game
    Jelly-go Game

    ReplyDelete
  8. I mean, what you say is valuable and all. But think of if you added some great images or video
    clips to give your posts more, “pop”! Your content is excellent but with images and video clips,
    this blog could undeniably be one of the most beneficial in its niche. Amazing blog!
    Ice cream maker game online
    4 player sheep party best online game
    Colorzzle online

    ReplyDelete
  9. Your writings are so good.It's very kind of you to share your writings.When I have spare time, I often read your posts.Thanks for sharing your knowledge.
    Real Flight Simulator best game for free Def Island Kick The Buddy online game

    ReplyDelete

  10. food games 2019 online
    basketball free online
    soccer games free
    Your writings are so good.It's very kind of you to share your writings.When I have spare time, I often read your posts.Thanks for sharing your knowledge.

    ReplyDelete
  11. Thanks for sharing the post.. parents are worlds best person in each lives of individual..they need or must succeed to sustain needs of the family
    miniclip com 2019, a10 kids, Jogos 2019

    ReplyDelete
  12. jogos io gratis
    friv free online juegos
    2 player games for boy
    This is really a nice and informative. containing all information and also has a great impact on the new technology. Thanks for sharing it

    ReplyDelete

  13. Papa Louie games online
    Arcade Golf: Neon games play
    Skateboard First Race games 2019
    All the contents you mentioned in post is too good and can be very useful. I will keep it in mind, thanks for sharing the information keep updating, looking forward for more posts.Thanks

    ReplyDelete