Singleton design pattern - Đừng lãng phí khi chúng ta có thể sử dụng lại một đối tượng

     Hiện nay hầu như các ngôn ngữ, framework  đều sử dụng singleton, vậy singleton là cái gì và nó mang lại lợi ích gì mà lại được sử dụng rộng rãi như vậy, chúng ta hãy cùng tìm hiểu nhé.



1. Singleton là gì?

    Singleton là tên của  một design pattern thuộc nhóm creational (khởi tạo) và được sử dụng rất nhiều trong các framework của các ngôn ngữ hướng đối tượng. Mục đích của nó là đảm bảo một đổi tượng sẽ được khởi tạo đúng một lần duy nhât, nói đơn giản nếu đối tượng đó chưa được khởi tạo thì nó sẽ tạo ra đổi tượng đó, nếu đối tượng đó đã được khởi tạo rồi nó sẽ không tạo ra đối tượng mà sẽ sử dụng đối tượng đã được khởi tạo trước đó để sử dụng.

2. Tại sao không nên khởi tạo một đối tượng nhiều lần?

    Lấy ví dụ, mình có class Database. Đây là class tương tác đến cơ sở dữ liệu. Bạn thấy đó, trong một project việc tương tác với CSDL là rất nhiều lần, nên việc bạn gọi đến class Database là điều rất thường xuyên. Điều đó là đồng nghĩa mồi lần gọi đến class này lại được khởi tạo. Điều này có thực sự cần thiết? Câu trả lời là không, thế nên chỉ cần khởi tạo đối tượng đúng một lần là quá đủ.

3. Singleton đã làm thế nào để đối tượng được khởi tạo đúng một lần ?

    Mình sẽ copy một đoạn code mẫu PHP trên mạng để giải thích cho các bạn về cách Singleton hoạt động nhé.



    - Biến $instance = null đây là biến để chứa đối tượng Database, nó sẽ gán mặc định ban đầu là null.

    - Stactic method getInstance() này giúp dễ dàng sử dụng đối tượng trong singleton. Method này đóng vai trò kiểm tra đối tượng có được khởi tạo hay chưa nếu chưa thì sẽ khởi tạo Database và gán Database cho biến $instance, còn nếu đã khởi tạo rồi thì chỉ cần trả về thôi.

    *Lưu ý: khi gọi đến đối tượng sẽ không sử dụng từ khóa new class như thông thường mà buộc phải gọi thông qua static method getInstance() đó là lý do tại sao __construct() có scope là private.

    Cái hình mình ghi thiếu á đáng lẽ ra là $connection = $database->connection(); mới đúng :)))

    - Nếu bạn dùng PHP, thì trong singleton thường sẽ có magic method  __clone() để ngăn chặn việc clone một đối tượng. Cái này các bạn có thể lên mạng để tìm hiểu thêm. À sắp tới mình sẽ viết bài về clone một đối tượng trong PHP nha :v.

4. Khi nào nên sử dụng Singleton?

   - Những trường hợp bạn có thể sử dụng singleton khi đối tượng đó được sử dụng rất nhiều nơi trong project như: Database, Logger, Cache...

 - Hy vọng qua bài viết có thể giúp bạn hiểu và áp dụng được singleton. Bye


Nhận xét