## 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 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:
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
0 Bình luận trong "Singleton Pattern tạo thực thể hiệu quả"