Singleton Pattern (chỉ tồn tại một thực thể duy nhất).

Đúng như tên gọi của nó là chỉ tạo ra một thực thể duy nhất. 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. Nó sẽ được áp dụng thực tế vào việc trong một thời điểm chỉ có 1 thực thể được tồn tại duy nhất vd như: config, connect database, hay ghi log. 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 đó. Ví dụ, ta 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. 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 DataBase {
  static private $_instance = NULL;
}

Thuộc tính static sẽ được chia sẻ giữa các đối tượng của class , do vậy nêú đã tồn tại thực thể của class thì khi tham chiếu đến class đó sẽ lấy được thuộc tính của class này. Nó sẽ trả về 1 thực thể khi tồn tại hoặc khởi tạo nếu chưa tồn tại.

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

getInstance() để kiểm tra thuộc tính $_instance, nếu nó không có giá trị 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:

$dataBase = DataBase::getInstance();

Ví dụ setup language trong php:

<?php
class SetLanguage {
	private function __construct() {

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

    function set($language, $value) {
        $this->_settings[$language] = $value;
    }

    function get($index) {
        return $this->_settings[$index];
    }
}

$setLanguage = SetLanguage::getInstance();
$setLanguage->set('language', 'vi');
$setLanguage = SetLanguage::getInstance();
var_dump($setLanguage->get('language'));

Trong trường hợp trên bạn đã config language sang tiếng Việt thì khi khởi tạo một class mới nó vẫn lưu setup tiếng Việt.