Singleton Design Pattern
Singleton là 1 trong 5 design pattern thuộc nhóm Creational Design Pattern – nhóm hỗ trợ khởi tạo class.
Mục đích của Singleton là đảm bảo chỉ duy nhất 1 instance của class được khởi tạo và có thể truy cập từ mọi nơi đến instance đó.
Kiến trúc

- Đặt constructor là private để client không thể khởi tạo object.
- Tạo 1 biến static private là instance của class đó để đảm bảo nó là duy nhất và chỉ được tạo ra trong class đó thôi.
- Tạo 1 public static method trả về instance vừa khởi tạo trên. Đây là cách duy nhất để có thể truy cập vào instance này.
Singleton được sử dụng khi:
- Lớp đó chỉ cần duy nhất 1 instance.
- Có thể truy cập instance đó từ mọi nơi.
- Dùng giải quyết các bài toán cần truy cập vào ứng dụng như: Shared resources, Log, Configuration …
- Một số design pattern khác cũng sử dụng Singleton như: Abstract Factory, Builder, Prototype, Facade …
Ví dụ:
Lớp Database là Singleton:
class Database
{
private $table_name;
private static $instance;
private function __construct($table_name) {
$this->table_name = $table_name;
// do somethings
}
public function editRecord() {
// edit record
echo 'Edit record of table ' . $this->table_name;
}
public static function getInstance($table_name) {
// kiểm tra đối tượng nếu chưa được khởi tạo thì khởi tạo nó
if (static::$instance == null) {
static::$instance = new Database($table_name);
}
return static::$instance;
}
}
// gọi singleton
$database = Database::getInstance('products');
$database->editRecord();