📘

シングルトンの使い所、使わない所

2024/04/07に公開

はじめに

今までシングルトンというデザインパターンをよく聞いたり目にしてましたが、概要をぼんやりわかっているつもりで、実際アプリケーションのどの部分で使うべきなのか?メリットってなんだっけ?という具体的な部分までの理解をしていなかったので、この機会に学習し直してアウトプットしようと思います。
この記事の想定言語はPHP、フレームワークはlaravelで書いています。

シングルトンとは

インスタンスが必ず一つになることを保証す、グローバル変数のようなクラスを作成することができるデザインパターンの一つ。
実際のコードなどはこちらの記事が参考になりましたのでご確認ください。
https://qiita.com/buntafujikawa/items/2e8e8f13b6eb2f2f9e64

インスタンスをたくさん作っても全て同じものが返ってくるのでその特徴を使うと、アプリケーションのリソースを節約できたり、保守性が高まったりします。

シングルトンの何がいいのか

シングルトンを使うことによって、インスタンスの競合やメモリリークなどを回避し、リソースを効率よく使うことが可能になります。

シングルトンの仕組み

シングルトンをどのように実装していくのかという部分を見ていこうと思います。
ざっくり以下の二つのポイントがあります。

  1. Privateなconstructorを作成する
    constructorをprivateにすることで直接そのクラスのインスタンスの生成を防ぐことで、別々のインスタンスが勝手に生成されないようにします。
  2. インスタンスにアクセスするためのstaticメソッドを実装する
    constructorで外部からインスタンスを生成できないため、staticメソッドでインスタンスを返すメソッドを実装して、インスタンス生成はそのメソッドを呼び出すことで行うようにします。
// Your code here!
final class Singleton 
{
    // インスタンスを保持するプロパティ
    private static ?Singleton $instance = null;
    
    // privateでconstructorを定義
    private function _construct() 
    {
    }
    
    // インスタンスを返却する静的メソッドを定義
    public static function getInstance(): Singleton
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    // 必要な処理を追加
    public function call()
    {
        // 何か処理
        echo 'こんちにわ';
    }
}

$s = Singleton::getInstance();
$s->call();

使いどころ

  1. ログの処理
  2. Config設定の参照
  3. ハードウェアとのアクセスのインターフェースとして使う
    →メールサービスとか
    など

使うべきではないところ

  1. 複数のインスタンスが必要なもの
  2. ユーザーセッションデータ
  3. 動的なリソースの管理

Discussion