Ra mắt hai series mới cực hot Trí tuệ nhân tạo A đến ZPython công cụ không thể thiếu khi nghiên cứu Data science, Machine learning.

Singleton Pattern tạo thực thể hiệu quả

Singleton## 1. Singleton Pattern là gì?

Singleton pattern là một design pattern có tần suất sử dụng khá nhiều trong lập trình. Singleton pattern giống như ý nghĩa của nó là việc tạo ra một thực thể duy nhất. Pattern này rất đơn giản với sơ đồ UML như sau:

Singleton Pattern UML

Singleton pattern thuộc về Creational Design Pattern là một mẫu áp dụng cho việc khởi tạo đối tượng, áp dung pattern này khi ứng dụng của bạn muốn tạo ra một thực thể duy nhất từ một class và dùng chung nó cho nhiều trường hợp. Ví dụ, website cần một đối tượng kết nối đến database nhưng chỉ cần duy nhất một đối tượng cho toàn bộ ứng dụng, sử dụng Singleton Pattern sẽ giải quyết được vấn đề này. Để bắt đầu bạn sử dụng một thuộc tính static để đảm bảo rằng chỉ có một thực thể của lớp này tồn tại.

class SomeClass {
  static private $_instance = NULL;
}

Trong phần lập trình hướng đối tượng, thuộc tính static được chia sẻ giữa các đối tượng của class, do đó nếu đã có một thực thể của class thì tất cả sẽ tham chiếu đến class đó có thể sử dụng thuộc tính này. Bước tiếp theo là tạo ra một phương thức sẽ tạo ra một instance của class nếu nó chưa tồn tại và trả về instance đó.

class SomeClass {
  static private $_instance = NULL;
  static function getInstance() {
    if (self::$_instance == NULL) {
      self::$_instance = new SomeClass();
    }
    return self::$_instance;
  }
}

Singleton pattern thường sử dụng một phương thức với cái tên getInstance() để kiểm tra thuộc tính $_instance, nếu nó có giá trị NULL thì sẽ tạo ra một instance và gán cho thuộc tính này, kết quả là một instance được trả về. Như vậy, class này có thể được sử dụng như sau:

$obj1 = SomeClass::getInstance();

2. Ví dụ áp dụng Singleton Pattern trong PHP

Trong đối tượng đầu tiên của ứng dụng, thực thể được tạo ra và được gán cho thuộc tính private bên trong nó. Chúng ta cùng bắt đầu với ví dụ về Singleton pattern, tạo ra một file để thiết lập cấu hình. Bạn có thể tham khảo cách tạo môi trường thực hành với PHP giúp thực hiện các đoạn code test dễ dàng hơn. Tạo một file là singleton.php trong thư mục oop/pattern với nội dung

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Ví dụ về Singleton pattern</title>
</head>
<body>
    <?php
    /* The Config class.
     * The class contains two attributes: $_instance and $settings.
     * The class contains four methods:
     * - __construct()
     * - getInstance()
     * - set()
     * - get()
     */
    class Config {

       static private $_instance = NULL;
       private $_settings = array();

       // Private methods cannot be called
       private function __construct() {}
       private function __clone() {}

       // Phương thức này trả về một thực thể của class
       static function getInstance() {
          if (self::$_instance == NULL) {
             self::$_instance = new Config();
          }
          return self::$_instance;
       }
       // Phương thức này thiết lập cấu hình
       function set($index, $value) {
          $this->_settings[$index] = $value;
       }
       // Phương thức này lấy thiết lập cấu hình
       function get($index) {
          return $this->_settings[$index];
       }
    }
    // Tạo một đối tượng Config
    $config = Config::getInstance();

    // Thiết lập các giá trị trong thuộc tính cấu hình
    $config->set('database_connected', 'true');

    // In giá trị cấu hình
    echo '<p>$config["database_connected"]: ' . $config->get('database_connected') . '</p>';

    // Tạo một đối tượng thứ hai
    $test = Config::getInstance();
    echo '<p>$test["database_connected"]: ' . $test->get('database_connected') . '</p>';

    // Xóa các đối tượng sau khi sử dụng
    unset($config, $test);
    ?>
</body>
</html>

Truy cập thử vào file này chúng ta thấy kết quả như sau:

Ví dụ về Singleton Pattern

Bạn thấy đấy, mỗi khi tạo ra một đối tượng của class Config nó sẽ kiểm tra và chỉ tạo thực thể (instance) khi chưa có thực thể nào được tạo. Biến $test sẽ cùng tham chiếu đến đối tượng từ class Config do đó các thiết lập cấu hình có thể chia sẻ lại.

3. Lời kết

Singleton pattern là design pattern tương đối đơn giản, nhưng việc áp dụng khá hiệu quả, nó tạo ra một thực thể duy nhất để sử dụng, giúp tối ưu hóa việc sử dụng tài nguyên để chạy ứng dụng. Singleton pattern cũng thường được so sánh với Factory pattern, nhưng mỗi mẫu lập trình có những điểm mạnh yếu khác nhau.


CÁC BÀI VIẾT KHÁC

FirebirD

Đam mê Toán học, Lập trình. Sở thích chia sẻ kiến thức, Phim hài, Bóng đá, Cà phê sáng với bạn bè.

MVC Pattern cần có trong mọi framework PHP

Factory Pattern nhà máy tạo thực thể

0 Bình luận trong "Singleton Pattern tạo thực thể hiệu quả"

Thêm bình luận