35°

php设计模式之单例模式

单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。

//单例模式

class Singleton { //保存单例实例的成员变量必须被声明为静态类型。 private static $instance = [];

protected function __construct(){}

//不允许对单例程序进行克隆和反序列化。
protected function __clone() {}

public function __wakeup()
{
    throw new \Exception("Cannot unserialize singleton");
}

public static function getInstance()
{
    $subclass = static::class;
    if (!isset(self::$instance[$subclass]))
    {
        //如果需要支持多线程,需要在此处放置线程锁
        //注意new self(永远singleton) 和 new static(当前调用类(子类或者singleton))区别
        self::$instance[$subclass] = new static;
    }

    return self::$instance[$subclass];
}

}

//日志 class Logger extends Singleton { public function printLog(string $msg) { print($msg); }

public static function log(string $msg)
{
    $logger = self::getInstance();
    $logger->printLog($msg);
}

}

//配置 class Config extends Singleton { private $hashmap = [];

public function getValue(string $key)
{
    return $this->hashmap[$key];
}

public function setValue(string $key, string $value)
{
    $this->hashmap[$key] = $value;
}

}

Logger::log('start'); echo '<br/>';

$config1 = Config::getInstance();

$login = 'test_login'; $password = 'test_password';

$config1->setValue('login', $login); $config1->setValue('password', $password);

$config2 = Config::getInstance();

if ($login == $config2->getValue('login') && $password == $config2->getValue('password') ) { Logger::log('config工作的很fine'); }

echo '<br/>'; Logger::log('end');

单例模式应该是比较简单设计模式了,主要考虑如何运用,

本文由【山人有妙计】发布于开源中国,原文链接:https://my.oschina.net/hackdebug/blog/3155716

全部评论: 0

    我有话说: