2010/03/04

[PHP, デザインパターン] Singleton を作ってみる

毎回最適化ばっかりだと、飽きてきたので、GoFパターンの実装も練習してみる。
まずは Singleton パターン。

Singleton パターン(シングルトン・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。/via wikipedia
一つ間違えばグローバルと化すしろもの。
でも結構便利なので、グローバルとして使っちゃうかも・・・・。
カプセル化してるからいいじゃん・・・・・っていう言い訳・・・。


<?php

class Singleton
{
    private static $_instance = null;

    public static function getInstance()
    {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }

        return self::$_instance;
    }

    final private function __construct()
    {
    }

    final public function __clone()
    {
        throw new Exception('複製できないよ。');
    }
}

$a = Singleton::getInstance();
$b = Singleton::getInstance();

if ($a === $b) {
    echo '同じ';
} else {
    echo '違う';
}
echo '
'; try {     $d = clone $a; } catch (Exception $e) {     echo $e->getMessage(); } $c = new Singleton();

シングルトンは基本的にこんな感じになると思う。
実験環境が PHP5.2.6 なので静的遅延束縛が出来ないので。
ってか、この「静的遅延束縛」って言葉かっこいい。中2病が疼く。

とりあえずの実装としては、コンストラクタを private に。
コンストラクタと__clone() をfinalにする。

上のスクリプトの実行結果も
”同じ”と”複製できないよ”ってでるし、
最後の new してるとこも Fatal error: Call to private Singleton::__construct()
になって。ちゃんといい感じ。

Ubuntu の apt-get で入れられる PHP が 5.3 になったら、
静的遅延束縛バージョンも作ってみようかと思う。