Hiển thị kết quả từ 1 đến 6 / 6
  1. #1
    Tham gia
    20-12-2009
    Bài viết
    42
    Like
    0
    Thanked 1 Time in 1 Post

    Thông tin Design Patterns -> Singleton Pattern

    a) Mục đích, ý nghĩa

    Singleton có lẽ là một trong những pattern có tính trừu tượng dễ hiểu nhất mà người học design pattern nào cũng biết. Trong dự án vừa rồi làm về 1 website (wap.vietteltelecom.com.vn) tôi gặp phải một vấn đề là website có nhiều kết nối một lúc, vấn đề liên quan đến connection pooling. Tôi đã chọn Singleton để implement những class đó. Tất nhiên singleton chỉ là một phần nhỏ, nhưng trong tài liệu này tôi sẽ viết về singleton pattern như là bài viết đầu tiên về loạt bài design pattern tiếp theo. Những bài viết của tôi thường lấy ý tưởng từ những quyển sách kinh điển được diễn đạt lại thông qua những “sự hiểu” của cá nhân.

    Singleton đảm bảo rằng một class có duy nhất một thực thể (instance) hay đối tượng (object) và cung cấp một cách thức truy nhập toàn cục để có thể từ bất kỳ đâu cũng lấy được instance duy nhất đó. Chúng ta cũng gọi thực thể duy nhất đó là thực thể chính (solely) của class đó.

    Đối với một vài class thì việc chỉ có duy nhất một instance (object) là rất quan trọng. Mặc dù có rất nhiều máy in trong hệ thống nhưng chỉ có một printer spooler. Cũng chỉ có một file system và một windows manager. Cũng như trong thiết kế connection pool thì chỉ có một connection pool quản lý nhiều connection.

    Làm thế nào để chúng ta đảm bảo một class chỉ có một thể hiện duy nhất và dễ dàng truy nhập được? Một object toàn cục có thể làm cho nó dễ dàng truy nhập được nhưng không ngăn cấm bạn tạo thêm nhiều object khác.

    Một giải pháp tốt hơn là làm cho class đó tự bản thân nó có thể điều khiển được thực thể chính của nó. Class đó có thể đảm bảo rằng không có thực thể khác được tạo ra (bằng cách chặn đứng các yêu cầu tạo object mới) và cung cấp cách thức để truy nhập được thực thể chính của nó. Đó là singleton pattern.

    b) Cấu trúc

    http://dotnetvn.net/vi/Signleton_Pat..._Tiet_138.aspx

    c) Ưu nhược điểm

    · Quản lý việc truy cập tốt hơn vì chỉ có một thể hiện đơn nhất.

    · Cho phép cải tiến lại các tác vụ (operations) và các thể hiện (representation) do pattern có thể được kế thừa và tùy biến lại thông qua một thể hiện của lớp con

    · Quản lý số lượng thể hiện của một lớp, không nhất thiết chỉ có một thể hiện mà có số thể hiện xác định.

    · Khả chuyển hơn so với việc dùng một lớp có thuộc tính là static, vì việc dùng lớp static chỉ có thể sử dụng một thể hiện duy nhất, còn Singleton Pattern cho phép quản lý các thể hiện tốt hơn và tùy biến theo điều kiện cụ thể.

    d) Implemention

    public class Singleton

    {

    private static Singleton instance;



    private Singleton() { }



    public static Singleton Instance

    {

    get

    {

    if (instance == null)

    {

    instance = new Singleton();

    }

    return instance;

    }

    }

    }


    P/S: Có thể tham khảo các bài viết về các mẫu khác tại: http://dotnetvn.net/vi/Design_Patter...19.aspx?Cat=19
    Quote Quote

  2. Thành viên Like bài viết này:


  3. #2
    Tham gia
    05-05-2008
    Bài viết
    183
    Like
    0
    Thanked 8 Times in 6 Posts
    Thường Singleton trong C# viết thế này:
    Code:
    public class Singleton
    {
        public static Singleton Instance { get; private set; }
    
        static Singleton()
        {
            Instance = new Singleton();
        }
      
        private Singleton() { }
    }
    Còn đây là Singleton nhưng dùng như static class: (Tớ thích cái này hơn)
    Code:
    public class Singleton
    {
        private static Singleton Instance { get; set; }
    
        static Singleton()
        {
            Instance = new Singleton();
        }
      
        private Singleton() { }
    
        public static void DoSomething()
        {
            Instance.DoSomething_Internal();
        }
    
        private void DoSomething_Internal()
        {
            // Do something
        }
    }
    Được sửa bởi littleNeo lúc 22:19 ngày 20-06-2010

  4. Thành viên Like bài viết này:


  5. #3
    Tham gia
    20-12-2009
    Bài viết
    42
    Like
    0
    Thanked 1 Time in 1 Post
    Hix, có khác gì đâu!

    Của bạn thay vì: static Singleton()
    thì fai để là: public static Singleton()

  6. #4
    Tham gia
    05-05-2008
    Bài viết
    183
    Like
    0
    Thanked 8 Times in 6 Posts
    Khác là ko cần phải chạy if đi if lại.
    Thử để public static Singleton() đi, xem nó báo cái gì rồi đính chính giùm tớ nhé, Thanks

  7. #5
    Tham gia
    20-12-2009
    Bài viết
    42
    Like
    0
    Thanked 1 Time in 1 Post
    Uh, nhầm vì nó là hàm tạo, nhưng đấy chỉ là 1 ví dụ, hix. Còn cách cài đặt có thể có nhiều cách mà!

    Lạy trời!

  8. #6
    Tham gia
    16-08-2002
    Bài viết
    217
    Like
    0
    Thanked 3 Times in 2 Posts

    Dùng thêm Generic

    Code:
    class GenericSingleton<T> where T : class, new()
        {
            private static T instance;
    
            public static T GetInstance()
            {
                lock (typeof(T))
                {
                    if (instance == null)
                    {
                        instance = new T();
                    }
                    return instance;
                }
            }
        }
    Và sử dụng như sau:
    Code:
    MyClass myObject = GenericSingleton<MyClass>.GetInstance();

  9. Thành viên Like bài viết này:


Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •