单例模式

为某个类创建仅有一个可访问的实例.

class Singleton
{
    private static $instance;
    /**
     * Singleton constructor.
     */
    private function __construct()
    {
    }
    /**
     * return self instance.
     *
     * @return self
     */
    public static function getInstance()
    {
        if(!self::$instance){
            self::$instance = new self();
        }
        return self::$instance;
    }
    /**
     * 防止对象被clone.
     */
    private function __clone()
    {
        trigger_error('clone is not allowed!');
    }
}

多个类的单例模式

abstract class FactoryAbstract
{
    protected static $intances = [];

    /**
     * FactoryAbstract constructor.
     */
    protected function __construct()
    {

    }

    public static function getInstance()
    {
        $className = self::getClassName();
        if(empty(self::$intances[$className])){
            self::$intances[$className] = new $className();
        }

        return self::$intances[$className];
    }

    public static function removeInstance()
    {
        $className = self::getClassName();
        if(array_key_exists($className, self::$intances)){
            unset(self::$intances[$className]);
        }
    }

    final protected static function getClassName()
    {
        return get_called_class();
    }

    final protected function __clone()
    {

    }
}

abstract class Factory extends FactoryAbstract
{
    final public static function getInstance()
    {
        return parent::getInstance();
    }

    final public static function removeInstance()
    {
        parent::removeInstance();
    }

}

// @test
class FirstProduce extends Factory
{
    public $a = [];
}

class SecondProduce extends Factory
{

}

FirstProduce::getInstance()->a[] = 1;
FirstProduce::getInstance()->a[] = 2;

SecondProduce::getInstance()->a[] = 11;
SecondProduce::getInstance()->a[] = 12;

print_r(FirstProduce::getInstance()->a);
// Array
//(
//    [0] => 1
//    [1] => 2
//)

print_r(SecondProduce::getInstance()->a);
//Array
//(
//    [0] => 11
//    [1] => 12
//)