darudaru

だるだるしてるエンジニア

PHPでデザインパターン「Singletonパターン」

GoFデザインパターンPHPでプログラムを書いてみながら勉強していきます。「増補改訂版 Java言語で学ぶデザインパターン入門」を参考にさせて頂いています。プログラムはGithubにあげていきます。

Singletonパターンとは

singletonとは、要素を1個しか持たない集合のことです。Singletonパターンとは、インスタンスが1個しか存在しないことを保証するデザインパターンです。

Singletonパターンの構造

singleton_m-2

  • Singletonクラス 唯一のインスタンスを得るためのstaticメソッドを持っています。このメソッドはいつも同じインスタンスを返します。

Singletonクラスのコンストラクタはprivateになっており、外部からコンストラクタを呼ぶことを禁止しています。このように外部からnewすることをでさせることで、インスタンスを1個しか生成されないことを保証しています。

Singletonパターンのメリット

  • インスタンスが複数存在することの弊害を無くし、プログラムを安全にさせる
  • 設計をシンプルにできる

Singletonパターンの実装例

インスタンスを返すgetInstance()メソッドだけあるシンプルなクラスです。

singleton

<?php
namespace DesignPatterns\Src\Creational\Singleton;
class CreatedInstance
{
    private static $instance;
    private function __construct()
    {
    }
    public static function getInstance()
    {
        if(!isset(self::$instance)){
            self::$instance = new CreatedInstance();
        }
        return self::$instance;
    }
}

ちなみにPHPのコンストラクタをprivateで作れることを知りませんでした。できるんだね。

関連パターン

  • AbstractFactoryパターン
  • Builderパターン
  • Facadeパターン
  • Prototypeパターン

まとめ

Singletonパターンについて調べていると、メリットよりもデメリットの方が多いパターンと言われることが多いようです。テストがしにくい、必要なインスタンスは1つだけという考えは推測にすぎないため、後に要件が変化した時の変更が大変、ということだそうで。うーん、確かに。テストについてはDIで対応するとして、あとでインスタンスを複数生成したい、という時には対応は厳しそうです。というか、なかなか設計時にインスタンスが複数必要か否かの判断はできない。

必要なインスタンスは1つだけだと確定している時に使うとよさそうです。仕事場でSingletonパターンの用途として一番多いものは、DBの接続のインスタンス生成でしょうか。DBへのコネクションは1回だけでいいからですね。

デザインパターン