Singleton パターン

デザインパターンちゃんと勉強をしようと思ったので結城さんの本を 1 つ 1 つ実装してみる。 前回の FactoryMethodからの続き。

Singleton パターンを用いると、そのクラスのインスタンスが 1 つしか生成されないことを保証することができる。ロケールや Look&Feel など、絶対にアプリケーション全体で統一しなければならない仕組みの実装に使用される。

これは良くみる。とくにファイル操作とか、データベース接続とかコストがかかるようなものに使われるのを良く目にする印象。なので「全体で統一しなければならない」というより「統一すると色々お得」みたいな印象が強い。

クラス図

Singleton PlantUML

実装に関しては注意が。 PHP ではクラス変数を宣言時に新しいインスタンスを作成しての初期化は私が知る限りできない。

そのため、該当書籍で(問題 5-3)に指摘されているような厳密な形での Singleton 実装できていない。指摘されている内容としてはコンストラクターでインスタンスの生成がされているかどうかを判断して、無かった場合は生成をしないと、割り込み処理が入った場合に唯一であるという事を担保できないという事である。

<?php
class Singleton
{
    private static $singleton = false;
    final private function __construct()
    {
        echo "インスタンスを生成しました。\n";
    }
    public static function getInstance()
    {
        if (self::$singleton === false) {
            self::$singleton = new Singleton();
        }
        return self::$singleton;
    }
}

↑ 本当は __construct で new Singleton したい。

下記ブログでは trait での実装を提案している Web も見つけたが避けて実装はした。

自分としての理解・疑問

  • 上記の並列処理のような形というのは想定していなかったので、素直に「なるほど!」と思うなどした。
  • Sigleton で実装するのは良いとして利用する場合に違う実装者がでた場合にはどうやって強制するのだろう。プログラミングの範疇ではなくて運用の話しかもしれないけど気になる。

参考