GoFのデザインパターンのSingletonをおさらいしてみました
Singletonはクラスのインスタンスが1つしか存在させたくない時や、使いまわせるインスタンスは使いまわしてnewのコストを減らすのに使ったりします
phpで書くとこんな感じ
class Singleton
{
private $_id;
protected function __construct()
{
$this->_id = md5(date('r') . mt_rand());
}
public static function getInstance()
{
static $instance = null;
if ($instance === null) {
$instance = new static;
}
return $instance;
}
private function __clone()
{
}
private function __wakeup()
{
}
public function getId() {
return $this->_id;
}
}
class SingletonChild extends Singleton
{
}
$one = Singleton::getInstance();
echo $one->getId(), PHP_EOL;
$one = Singleton::getInstance();
echo $one->getId(), PHP_EOL;
$two = SingletonChild::getInstance();
echo $two->getId(), PHP_EOL;
コンストラクタをprotectedにすることでnewできなくして
__cloneをoverrideしてprivateに
__wakeupをoverrideしてprivateにすることで
インスタンスのコピーも作れなくなります
1度つくられたインスタンスを保持して使いまわします
継承クラスでは別のインスタンスになります
参考) http://ja.phptherightway.com/pages/Design-Patterns.html