GoFのデザインパターンのSingletonをおさらいしてみた

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

カテゴリーphp

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください