Posted at

PHPで学ぶデザインパターン(Singletonパターン)

More than 1 year has passed since last update.


Singletonパターンとは

インスタンスが一つしか存在しないことを保証するパターンです。

通常であれば複数インスタンスが存在しているが、いくつもインスタンスを作成したくない場合に使用します。

現在のシステム設計を表現したクラスのような、システムの中に1つしか存在しないプログラムを作成するようなイメージです。

クラス外部からインスタンスを作成できないようにするためにコンストラクタがprivateになっています。


Singletonパターンで登場する概念


singleton

唯一のインスタンスを得るためのstaticメソッドを持っており、いつも同じインスタンスを返します。


簡単なコードを書いてみる


Singleton

class Singleton

{
private static $singleton;

private function __construct()
{
echo "インスタンスを生成しました。" . PHP_EOL;
}

public static function getInstance()
{
if (!isset(self::$singleton)) {
self::$singleton = new Singleton();
}

return self::$singleton;
}
}

コンストラクタはprivateにして、外部からアクセスができないようにします。

その上で、getInstanceを外部に公開し、常に同じインスタンスを返すような設計にします。


呼び出し

$singleton1 = Singleton::getInstance();

$singleton2 = Singleton::getInstance();

if ($singleton1 === $singleton2) {
echo "singleton1とsingleton2は同じインスタンスです。" . PHP_EOL;
} else {
echo "singleton1とsingleton2は違うインスタンスです。" . PHP_EOL;
}

/*
インスタンスを生成しました。
インスタンスを生成しました。
singleton1とsingleton2は同じインスタンスです。
*/

$test = new Singleton();
// Fatal error: Call to private Singleton::__construct() from invalid context in singleton.php

getInstanceで返されたインスタンスが同じインスタンスであることの確認と、外部からインスタンス化できないことを確認します。


メリット

どんなにコメントで一つしかインスタンスを作成してはいけないとか書いていても、人がコードを書く以上それが守られているとは限りません。

しかしこちらのパターンでは、インスタンスが一つしか存在しないことを保証できます。


参考

Java言語で学ぶデザインパターン入門