[Creational Patterns] - Singleton


この文章はリビルドマスターSingleton部を読んで翻訳整理した文章です.

意図する


シングルトーンは、クラスに1つのインスタンスしかない場合にグローバルアクセスポイントを提供する設計モードです.
単一トーンの長所と短所は、グローバル変数とほぼ似ています.グローバル変数はどこでも簡単に使用できますが、コードのモジュール性を破壊します.

質問する


シングルトーンモードは2つの問題を同時に解決するが、単発的な責任原則に違反する.
  • クラスにインスタンスが1つしか存在しないことを確認します.最も一般的な理由は、データベースやファイルなどの共有リソースへのアクセスを制御することです.
  • 起動方式は以下の通りです.想像してみてください.オブジェクトは作成されましたが、間もなく新しいオブジェクトを作成することにしました.作成したオブジェクトを受信するのではなく、新しく作成したオブジェクトを受信します.
    ジェネレータ呼び出しは常に新しいオブジェクトを返すように設計する必要があるため、この操作は通常のジェネレータとしては実現できません.

    クライアントは、自分が同じターゲットを使用していることさえ知らない可能性があります.
  • は、このインスタンスにグローバル・アクセス・ポイントを提供する.これらのグローバル変数は非常に便利ですが、どのコードも潜在的にこれらの変数の内容を上書きし、アプリケーションを破損させる可能性があります.そのため、非常に安全ではありません.
  • グローバル変数と同様に、単一トーンモードを使用すると、プログラム内の任意の場所から特定のオブジェクトにアクセスできます.ただし、インスタンスを他のコードで上書きしないように保護することもできます.

    解決策


    単一の色調のすべての体現体には、次の2つの共通点があります.
  • デフォルトジェネレータをプライベートに設定し、他のオブジェクトが単色クラスおよびnew演算子を使用しないようにします.
  • 生成者の役割を果たす静的生成方法を作成する.このメソッドは、パーソナルジェネレータを呼び出してオブジェクトを作成し、静的フィールドに格納します.メソッドの後続呼び出しのすべてのキャッシュオブジェクトを返します.
  • コードが単色クラスにアクセスできる場合は、単一トーンの静的メソッドを呼び出すことができます.したがって、メソッドが呼び出されるたびに、同じオブジェクトが返されます.

    現実的類似性


    政府は単一の色調モードの良い例です.一つの国には正式な政府しかない.政府を構成する個人の身分とは関係なく、「X政府」の称号は責任者グループを識別する世界的な近接点である.

    こうぞう


  • 単一トンクラスは、クラスの同じインスタンスを返す静的方法getInstanceを宣言する.
  • シングルトーンのジェネレータは、クライアントコードから非表示にする必要があります.モノトーンオブジェクトを取得する唯一の方法は、getInstanceメソッドを呼び出すことです.

    適用性


  • アプリケーションのクラスにすべてのクライアントで使用できるインスタンスが1つしかない場合は、Singletonモードを使用します.

  • グローバル変数をより厳密に制御する必要がある場合はSingletonモードを使用します.
  • メリットとデメリット


    長所


  • クラスにインスタンスが1つしかないかどうかを確認できます.

  • このインスタンスに対するグローバル・アクセス・ポイントを取得できます.

  • モノトーンオブジェクトは、最初のリクエスト時にのみ初期化されます.
  • 短所


  • 単一責任の原則に違反する.

  • モノトーンモードは、プログラム内のコンポーネントが互いによく知られている場合に不良設計を隠す原因である可能性があります.

  • 複数のスレッドが単一トーンオブジェクトを複数回作成しないようにするには、マルチスレッド環境などの特殊な環境が必要です.

  • 多くのテストフレームワークは、シミュレーションオブジェクトの作成時に継承に依存するため、1トンのクライアントコードのユニットテストは困難です.単色クラスの作成者は専用であり,静的メソッドを再定義することは多くの言語では不可能であり問題でもある.
  • Singleton in TypeScript


    TypeScriptのパターンを使う


    複雑度:★☆☆
    人気:★☆
    使用例:多くの開発者は、単色変調を逆モードと見なしています.これが、タイプスクリプトで使用率が低下した理由です.
    ID:モノトーンは、同じキャッシュオブジェクトを返す静的生成方法として認識できます.index.ts
    // 싱글톤 클래스는 getInstance 메서드를 정의하여 클라이언트가
    // 유일한 싱글톤 인스턴스에 접근할 수 있도록 한다.
    class Singleton {
      private static instance: Singleton;
    
      // 싱글톤의 생성자는 `new`연산자로 호출되어 직접적으로 생성되는 것을
      // 막기 위해 항상 private 이어야 한다.
      private constructor() {}
    
      // 정적 메서드는 싱글톤 인스턴스에 대한 접근을 제어한다.
      public static getInstance(): Singleton {
        if (!Singleton.instance) {
          Singleton.instance = new Singleton();
        }
    
        return Singleton.instance;
      }
    
      public someBusinessLogic() {}
    }
    
    function clientCode() {
      const s1 = Singleton.getInstance();
      const s2 = Singleton.getInstance();
    
      if (s1 === s2) {
        console.log('Singleton works, both variables contain the same instance.');
      } else {
        console.log('Singleton failed, variables contain different instances.');
      }
    }
    
    clientCode();
    결과

    サマリ


    モノトーンモードには、グローバルアクセスを制限するインスタンスが1つしかありません.このモードは、アプリケーションで特定のタスクを1つの場所で処理する必要がある場合に便利です.

    コメントサイト


  • https://refactoring.guru/design-patterns/singleton

  • https://refactoring.guru/design-patterns/singleton/typescript/example

  • https://sangcho.tistory.com/entry/%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80%EC%95%8C%EC%95%84%EC%95%BC%ED%95%A07%EA%B0%80%EC%A7%80%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4