Site icon LCDUNG

Pattern Singleton là gì?

Singleton

Khi thiết kế một ứng dụng web, Thường bạn chỉ muốn cho phép truy cập tới một và chỉ một đối tượng của class cụ thể. Singleton pattern sẽ giúp bạn làm điều đó.

<?php
class Singleton
{
    /**
     * @var Singleton The reference to *Singleton* instance of this class
     */
    private static $instance;
    
    /**
     * Returns the *Singleton* instance of this class.
     *
     * @return Singleton The *Singleton* instance.
     */
    public static function getInstance()
    {
        if (null === static::$instance) {
            static::$instance = new static();
        }
        
        return static::$instance;
    }

    /**
     * Protected constructor to prevent creating a new instance of the
     * *Singleton* via the `new` operator from outside of this class.
     */
    protected function __construct()
    {
    }

    /**
     * Private clone method to prevent cloning of the instance of the
     * *Singleton* instance.
     *
     * @return void
     */
    private function __clone()
    {
    }

    /**
     * Private unserialize method to prevent unserializing of the *Singleton*
     * instance.
     *
     * @return void
     */
    private function __wakeup()
    {
    }
}

class SingletonChild extends Singleton
{
}

$obj = Singleton::getInstance();
var_dump($obj === Singleton::getInstance());             // bool(true)

$anotherObj = SingletonChild::getInstance();
var_dump($anotherObj === Singleton::getInstance());      // bool(false)

var_dump($anotherObj === SingletonChild::getInstance()); // bool(true)

Đọan code trên thực thi singleton pattern sử dụng biến static
phương thức static getInstance(). Note the following:

Singleton pattern hữu ích khi chỉ một đối tượng được tạo từ một class trong toàn thời gian của một request trong một ứng dụng web. Đặc trưng là khi bạn có các đối tượng toàn cục (như class Config) hay các tài nguyên được chia sẻ.

Bạn nên cẩn thận khi dùng Singleton bởi vì nó nó làm giảm khả năng test. Trong nhiều trường hợp dependency injection có thể (và nên) được dùng taại vị trí của class singleton. Sử dụng dependency injection có nghĩa bạn không giới thiệu coupling không cần thiết vào thiết kế của ứng dụng, bởi vì đối tượng sử dụng các tài nguyên toàn cục hay tài nguyên được chia sẻ không cần sự hiểu biết của class được khai báo cụ thể.

Exit mobile version