|
オブジェクト指向についてはまだまだ勉強中ですが、「PHPでGoFのデザインパターンを実装したら、どんな感じになるんだろ?」と思ってしまったので、ちょっとずつやってみることにしました。
間違いやご意見がありましたら、遠慮なくツッコミを入れてくださいm(_"_)m
今回は、Singletonパターンです。このパターンを簡単に説明すると、「あるクラスのインスタンスが1つしか存在しないようにする」パターンで、コンストラクタを潰す(Javaではprivateにする)代わりに、インスタンスを得る(publicな)メソッドを用意します(以下のクラス図を参照)。  以下が、サンプルコードになります。
●Singleton.php
<?php
class Singleton
{
var $str_;
function &getInstance()
{
static $singleton_;
if ($singleton_ == null) {
$singleton_ = new Singleton();
}
return $singleton_;
}
function setString($str)
{
$this->str_ = $str;
}
function getString()
{
return $this->str_;
}
}
$s1 =& Singleton::getInstance();
$s2 =& Singleton::getInstance();
$s3 =& Singleton::getInstance();
echo "\$s1==\$s2:" . (($s1 == $s2) ? "true" : "false") . "<br>";
echo "\$s1==\$s3:" . (($s1 == $s3) ? "true" : "false") . "<br>";
echo "<br>";
$s1->setString("s1");
echo "s1=" . $s1->getString() . "<br>";
echo "s2=" . $s2->getString() . "<br>";
echo "s3=" . $s3->getString() . "<br>";
echo "<br>";
$s2->setString("s2");
echo "s1=" . $s1->getString() . "<br>";
echo "s2=" . $s2->getString() . "<br>";
echo "s3=" . $s3->getString() . "<br>";
echo "<br>";
$s3->setString("s3");
echo "s1=" . $s1->getString() . "<br>";
echo "s2=" . $s2->getString() . "<br>";
echo "s3=" . $s3->getString() . "<br>";
echo "<br>";
?>
●出力結果
$s1==$s2:true
$s1==$s3:true
s1=s1
s2=s1
s3=s1
s1=s2
s2=s2
s3=s2
s1=s3
s2=s3
s3=s3
PHPで実装する場合、他のデザインパターンと比べて、
- インスタンスを返すメソッド(この場合、getInstanceメソッド)で、必ずオブジェクトの参照を返す必要がある
- クラスで管理するインスタンスを格納する変数は、static宣言する
- Singletonなクラスをインスタンス化する場合、newではなく、上記メソッドを使用する
のようなクセ(注意点)があります。
以前に公開したlog4pクラスにもSingletonパターンを適用しています。
|