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().
10 trang |
Chia sẻ: thanhle95 | Lượt xem: 567 | Lượt tải: 1
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