LoginSignup
53
43

More than 5 years have passed since last update.

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

Posted at

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言語で学ぶデザインパターン入門

53
43
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
43