PHP5でデザインパターン − Singletonパターン
久々に書いたつもりのエントリが残ってないと凹む。確認画面でサヨウナラ。
気を取り直して、今回は実装は簡単だけど気が利いて実用性も高いSingletonパターンです。
このパターンは、インスタンスを一つしか生成しないためのパターンです。DB接続などで使うと、不要な接続を行わずに済みます。
まずは、クラスの定義から。
MessageBox.class.php
<?php
/**
* SingletonパターンによるMessageBox
*/
class MessageBox
{
static $instance;
private $_msg;
private function __construct() {
echo "create MessageBox<br>\n";
}
static function getInstance()
{
if (self::$instance === null) {
self::$instance = new MessageBox();
}
return self::$instance;
}
public function setMsg($msg)
{
$this->_msg = $msg;
}
public function getMsg()
{
return $this->_msg;
}
}コンストラクタをprivateにすることで、外部からnewできなくなっています。インスタンスはstaticなメソッドgetInstanceを通して取得します。
次に、クライアントサイドのコード。
msgboxTest.php
<?php
/**
* Singletonパターンのテスト
*/
require_once 'MessageBox.class.php';
$box1 = MessageBox::getInstance();
$box1->setMsg('hello');
echo "BOX1:".$box1->getMsg()."<br>\n";
$box2 = MessageBox::getInstance();
$box2->setMsg('bye');
echo "BOX2:".$box2->getMsg()."<br>\n";
echo "BOX1:".$box1->getMsg()."<br>\n";
if ($box1 === $box2) {
echo '$box1 === $box2'."<br>\n";
}
$box3 = new MessageBox();このコードの実行結果はこちら。
$box2のsetMsgメソッドが$box1にも影響していることが分かります。また、=== による比較で同一のインスタンスであることも確認できました。
最後に、newでインスタンスを生成しようとしていますが、MessageBoxのコンストラクタはprivateなので外部から呼び出すことはできません。エラーで終了します。

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本
- 作者: Eric Freeman,Elisabeth Freeman,Kathy Sierra,Bert Bates,佐藤直生,木下哲也,有限会社福龍興業
- 出版社/メーカー: オライリージャパン
- 発売日: 2005/12/02
- メディア: 大型本
- 購入: 14人 クリック: 362回
- この商品を含むブログ (98件) を見る