2009-07-15 37 views
20

Tôi có một bộ nhớ cache đối tượng thực hiện mẫu thiết kế Singleton. Cách tiếp cận của tôi để singleton luôn lười tải trường hợp tĩnh khi thuộc tính được truy cập lần đầu tiên.Constructor tĩnh & Singleton class

public static Widget 
{ 
    get 
    { 
     if(instance==null) instance = new Widget(); 
     return instance; 
    } 
} 

Tuy nhiên, tôi biết rằng phương pháp này không an toàn và kiểm tra ví dụ là null giới thiệu một sự kém hiệu quả nhỏ. Nó sẽ là khôn ngoan để thực hiện một constructor tĩnh trên lớp mà instantiates dụ tĩnh?

Khi tôi hiểu nó, hàm tạo tĩnh sẽ được gọi bất cứ khi nào truy cập thuộc tính tĩnh đầu tiên xảy ra. Đây có phải là hợp lệ, và nó sẽ cung cấp bất kỳ lợi ích nào so với phương pháp tải lười hiện tại hay nó sẽ tốt hơn để khám phá việc thực hiện proxy, hoặc sử dụng khóa để buộc nó là luồng an toàn?

public static Widget 
    { 
     get 
     { 
      if(instance==null) 
      { 
       lock(padlock) 
       { 
        if(instance==null) instance = new Widget(); 
       } 
      } 
      return instance; 
     } 
    } 

Tôi không có nhiều kinh nghiệm với các nhà xây dựng tĩnh, vì vậy, bạn không muốn nhảy vào ý tưởng này nếu việc triển khai thuộc tính tải kém hơn hoặc kém hơn.

Chúc mừng, Gary

+1

Tôi tin này Q & A chủ đề sẽ cung cấp cho bạn những gì bạn muốn: http://stackoverflow.com/questions/246710/how-to-implement-a-singleton-in-c –

Trả lời

17

Jon Skeet có một tốt đẹp article trên singletons thảo luận về vấn đề này.

+0

này hoạt động tốt với Các thùng chứa IOC quá: http://www.tavaresstudios.com/Blog/post/Resolving-a-Singleton-Heres-how.aspx –

+0

Liên kết phải được cập nhật thành http://csharpindepth.com/Articles/General/Singleton. aspx – Dorus