Bài giảng Mẫu thiết kế hướng đối tượng và ứng dụng - Chương 3: Mẫu Singleton - Nguyễn Minh Huy

Mẫu Singleton Các vấn đềđề xung quanh: Khởi tạotạo trễtrễ (lazy loading): Thuộc tính static được khởi tạotạo khi truy xuất lớplớp lầnlần đầu. Sử dụng bộbộ nhớ không hiệu quả. Cách thức khởi tạotạo trễtrễ: B1: Nếu chưa khởi tạotạo Khởi thểthể hiện dùng chung. B2: TrảTrả vềthểthể hiện dùng chung. // // Khởi tạotạo NULL. Cookies* Cookies::m_cookies = NULL; Cookies* Cookies::getCookies()() { if (if (m_cookies == NULL) m_cookies = new Cookies(); return m_cookies; Mẫu Singleton Các vấn đềđề xung quanh: Chia sẻđađa luồng (multi-threading): Vấn đề truy xuất đồng thời trên Cookies::getCookies().

pdf10 trang | Chia sẻ: thanhle95 | Lượt xem: 461 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Bài giảng Mẫu thiết kế hướng đối tượng và ứng dụng - Chương 3: Mẫu Singleton - Nguyễn Minh Huy, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Mẫu Singleton GV. Nguyễn Minh Huy 1Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt Mẫu Singleton  Ngữ cảnh:  Bài toán:  Đối tượng Application trong ứng dụng.  Đối tượng Cookies trên Web Server.  Connection Pool. Mục tiêu:  Một lớp chỉ cần có MỘT thể hiện (instance).  Mở rộng: một lớp chỉ cần có xác định N thể hiện.  Các thể hiện này được chỉa sẻ trên toàn ứng dụng. 2Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt Mẫu Singleton  Hướng tiếp cận:  Chia sẻ thể hiện của lớp trên toàn ứng dụng:  Dùng thuộc tính static để lưu một thể hiện của lớp.  Đảm bảo lớp chỉ có MỘT thể hiện:  Đưa constructor vào tầm vực private. Cung cấp hàm static để trả về thể hiện đã lưu.  Điều khiển được quá trình khởi tạo đối tượng. 3Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt Mẫu Singleton  Cài đặt: class Cookies { private: static Cookies* m_cookies; Cookies(); public: static getCookies() void main() { Cookies *c1 = Cookies.getCookies(); // Thêm cookiesX // Bớt cookiesX Cookies *c2 = Cookies.getCookies();Cookies* { return m_cookies; } }; // Khởi tạo thể hiện dùng chung. Cookies* Cookies::m_cookies = new Cookies(); 4Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy // Thêm bớt cookiesX } CuuDuongThanCong.com https://fb.com/tailieudientucntt Mẫu Singleton  Các vấn đề xung quanh:  Khởi tạo trễ (lazy loading):  Thuộc tính static được khởi tạo khi truy xuất lớp lần đầu.  Sử dụng bộ nhớ không hiệu quả.  Cách thức khởi tạo trễ:  B1: Nếu chưa khởi tạo Khởi thể hiện dùng chung.  B2: Trả về thể hiện dùng chung. // Khởi tạo NULL. Cookies* Cookies::m_cookies = NULL; Cookies* Cookies::getCookies() { if (m_cookies == NULL) m_cookies = new Cookies(); return m_cookies; } 5Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt Mẫu Singleton  Các vấn đề xung quanh:  Chia sẻ đa luồng (multi-threading):  Vấn đề truy xuất đồng thời trên Cookies::getCookies(). Cookies* Cookies::getCookies() { if (m_cookies == NULL) Vùng không an toàn  Cách giải quyết:  Dùng Mutex.  Dùng Semaphore. 6Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy m_cookies = new Cookies(); return m_cookies; } Critical Section!! CuuDuongThanCong.com https://fb.com/tailieudientucntt Mẫu Singleton  Các vấn đề xung quanh:  Chia sẻ đa luồng (multi-threading):  Dùng Mutex trong Visual C++: class Cookies { private: static Mutex * m_mutex; Mutex* Cookies::m_mutex = new Mutex(); Cookies* Cookies::m_cookies = NULL; Cookies* Cookies::getCookies() static Cookies* m_cookies; Cookies(); public: static Cookies* getCookies(); }; 7Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy { mutex->WaitOne(); if (m_cookies == NULL) m_cookies = new Cookies(); mutex->ReleaseMutex(); return m_cookies; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Mẫu Singleton  Các vấn đề xung quanh:  Chia sẻ đa luồng (multi-threading):  Dùng synchronized trong Java: class Cookies { private static final Cookies m_cookies; private Cookies(); public static synchronized Cookies getCookies() { if (m_cookies == null) m_cookies = new Cookies(); return m_cookies; } }; 8Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt Mẫu Singleton  Các vấn đề xung quanh:  Chia sẻ đa luồng (multi-threading):  Dùng inner class (Bill Pugh, University of Maryland): class Cookies { private static class CookiesHolder { public static final Cookies m_cookies = new Cookies(); } private Cookies(); public static Cookies getCookies() { return CookiesHolder.m_cookies; } }; 9Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt Mẫu Singleton  Các vấn đề xung quanh:  Kiểm thử đơn vị (unit testing):  Cô lập các đơn vị mã nguồn để kiểm tra.  Singleton tạo ra Global State trong ứng dụng.  Gây khó khăn cho việc kiểm thử đơn vị. Mẫu nên tránh (anti-pattern):  Tạo liên kết chồng chéo trong mã nguồn.  Liên kết chồng chéo bị che dấu.  Không an toàn trong ứng dụng đa luồng.  Tạo Global State làm kiểm thử khó khăn.  Dùng Singleton một cách cẩn trọng!! 10Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh HuyCuuDuongThanCong.com https://fb.com/tailieudientucntt