Thứ Năm, 19 tháng 7, 2012

Design Pattern - Singleton

1. Đặt vấn đề
Trong một dự án lớn chúng ta có hàng trăm đến hàng nghìn đối tượng, nhưng tại một thời điểm chưa chắc chúng ta đã sử dụng hết tất cả các đối tượng đó, điều này dẫn đến việc lãng phí tài nguyên và làm chương trình chạy chậm. Mẫu singleton ra đời để giải quyết vấn đề đó
2.Định nghĩa(GOF)
 Mẫu singleton đảm bảo  chắc chắn 1 lớp chỉ có duy nhất 1 thể hiện và cung cấp 1 điểm (point) toàn cục để truy cập đến nó.
3. Sơ đồ UML
Phương thức Instance() dùng để tạo đối tượng Singleton

4. Code demo (c#)
4.1. Demo chưa quan tâm đến vấn đề đa luồng
class Singleton
    {
        private static Singleton _instance;
        public Singleton()
        {
        }
        public static Singleton instance()
        {
            if (_instance == null)
            {
                _instance = new Singleton();
            }
            return _instance;
        }
    }
NX: Với cách cài đặt trên chỉ một đối tượng duy nhất của lớp Singleton được tạo ra. Tuy nhiên nó gặp 1 vấn đề đó là khi có nhiều luồng cùng kiểm tra điều kiện if tại cùng 1 thời điểm thì chúng đều thỏa mãn do đó có nhiều đối tượng sẽ được tạo ra tại 1 thời điểm.
 4.2. Demo quan tâm đến vấn đề đa luồng
Có nhiều cách để xử lý vấn đề xảy ra ở cách cài đặt 4.1, ở đây tôi giới thiệu 2 cách.
Cách 1: 

class Singleton
    {
        private static Singleton _instance;
        public Singleton()
        {
        }
       private static object syncLock = new object();
        public static Singleton instance()
        {
           lock(syncLock){
              if (_instance == null)
               {
                _instance = new Singleton();
             }
          }
            return _instance;
        }
    }
 Nhược điểm: Có thể làm chương trình chạy chậm.
Cách 2:
 class Singleton
    {
        private static Singleton _instance = new Singleton();
        public Singleton()
        {
        }
        public static Singleton instance()
        {
             return _instance;
         }
}

Không có nhận xét nào:

Đăng nhận xét