PHPでデザインパターン「Singletonパターン」
GoFデザインパターンをPHPでプログラムを書いてみながら勉強していきます。「増補改訂版 Java言語で学ぶデザインパターン入門」を参考にさせて頂いています。プログラムはGithubにあげていきます。
Singletonパターンとは
singletonとは、要素を1個しか持たない集合のことです。Singletonパターンとは、インスタンスが1個しか存在しないことを保証するデザインパターンです。
Singletonパターンの構造
Singletonクラスのコンストラクタはprivateになっており、外部からコンストラクタを呼ぶことを禁止しています。このように外部からnewすることをでさせることで、インスタンスを1個しか生成されないことを保証しています。
Singletonパターンのメリット
- インスタンスが複数存在することの弊害を無くし、プログラムを安全にさせる
- 設計をシンプルにできる
Singletonパターンの実装例
インスタンスを返すgetInstance()メソッドだけあるシンプルなクラスです。
<?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回だけでいいからですね。