Vietnamese Developers’ Blog

Singleton Pattern – Fundamental

Posted in Design Pattern by Hoang Tran on October 8, 2007

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 tôi có phải implement một cái database connection pool và thread pool mà nó chính xác là một singleton object. Tôi đã chọn Singleton để implement những class đó. Tất nhiên singleton chỉ là một phần nhỏ, không phải phần cốt lõi trong những cái pool đó, nhưng trong bài viết 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 (nhiều khi là dịch lại – vì họ viết quá xuất sắc và không có gì cần thêm hay bớt). Tôi chỉ cố gắng hiểu một cách sâu sắc nhất và ghi lại theo cách hiểu. Trong ví dụ về design pattern, tôi chọn quyển Gang Of Four – Design Patterns – Elements of Reusable Object-Oriented Sofware, một quyển sách kinh điển nhất về design pattern. Nếu bạn có thời gian thì hãy dành thời gian đọc nó (bằng tiếng Anh để hiểu sâu sắc hơn).

1. Mục đính và ý nghĩa.

- Đả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.

2. Cấu trúc

(more…)

Tagged with: ,

Declare a copy constructor and an assignment operator for classes with dynamically allocated memory

Posted in C/C++, Programming by Hoang Tran on October 5, 2007

Source: Item 11 – Effective C++ – Scott Meyers

Con trỏ (pointer) trong C/C++ là một khái niệm vô cùng mạnh mẽ. Tuy nhiên nếu sử dụng chúng không cẩn thận thì chương trình sẽ phải trả giá rất đắt. Nó có thể gây crash và làm sụp đổ hệ thống. Trong bài viết này chúng ta sẽ xem xét khi chúng ta cần thể hiện một class mà có cấp phát bộ nhớ động (sử dụng pointer) thì cần chú ý những gì. Ví dụ chúng ta cần thể hiện một lớp String chẳng hạn.

// a poorly designed String class
class String
{
public:
    String(const char *value);
    ~String();
    ...     // no copy copy constructor or operator=

private:
    char *data;
};

String::String(const char *value)
{
    if (value) {
        data = new char[strlen(value) + 1];
        strcpy(data, value);
    }
    else {
        data = new char[1];
        *data = '';
    }
}

inline String::~String() { delete [] data; }

(more…)

Tagged with: