cheka.jp 超不定期で更新する写真達。お口直しにどうぞ。

[写経] PHPで学ぶデザインパターン02

— 注意 —
PHPによるデザインパターンの写経ですが、まんま書くと問題があるのでアウトプットとして備忘録メモです

初心者には分かりやすくて良い本なので、是非本屋でチェックして下さい。

URL : http://www.amazon.co.jp/PHPによるデザインパターン入門-下岡-秀幸/dp/4798015164
PHPによるデザインパターン入門

Singleton(シングルトン)で共有化

生成 + オブジェクト
アプリケーションの管理や設定ファイル、DBオブジェクトなど各クラスで共有するときに毎回newするのではなく、同一のオブジェクトを再利用するためのパターンです。

Singletonの作成

コンストラクタが外部から呼び出されるとSingletonにならないので、private宣言にしましょう。
また、オブジェクトがcloneされるとまずいので__clone呼び出し時に例外を投げるようにしてます。
継承されても良いようにfinal宣言にしましょう。

/*
Singletonクラス
*/
class Singleton{

	//自分自身をキャッシュする変数
	private static $self;
	//生成された時間
	private $time;

	//コンストラクタ(外部から呼び出せないようにprivateにする)
	private function __construct() {
		$this->time = date("Y/m/d H:i:s");
	}

	//Sigletonクラスの生成と取得
	public static function getSingleton() {
		if(empty(self::$self)){
			self::$self = new self();
			print "Singletonを生成しました!\r\n";
		}
		return self::$self;
	}

	//複製を禁止する(継承されてもエラーにするようにfinalで宣言する)
	public final function __clone() {
		throw new RuntimeException ("複製したらダメだよ!!");
	}

	//デバック用
	public function printCreateTime() {
		print "{$this->time}に生成されました\r\n";
	}
}

使ってみる

シングルトンで取得したオブジェクトが同じかチェックしてみましょう。

/*
使ってみる
*/
$sigleton_1 = Singleton::getSingleton();
$sigleton_1->printCreateTime();
sleep(3); //わざと遅らせる
$sigleton_2 = Singleton::getSingleton();
$sigleton_2->printCreateTime();

 

$php singleton.php
2014/02/17 12:15:26に生成されました
2014/02/17 12:15:26に生成されました

エラーも確認しましょう。
1.コンストラクタ呼び出し

$sigleton_3 = new Singleton();

 

$php singleton.php
Fatal error: Call to private Singleton::__construct() from invalid context in..

2.clone呼び出し

$sigleton_4 = clone $sigleton_1;

 

$php singleton.php
Fatal error: Uncaught exception 'RuntimeException' with message '複製したらダメだよ!!' in ..

なんてこと無いですね。

Add a Comment

メールアドレスが公開されることはありません。