技術共有

シングルトンパターンの実装

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1 はじめに

1.1 背景

アプリケーションがリソース共有の制御、構成管理、およびログ記録操作を実行する必要がある場合、共通の要件はグローバル アクセス ポイントを使用して、プログラムがアクセス ポイントを取得する場所に関係なく、このグローバル アクセス ポイントを介してアプリケーションにアクセスできるようにすることです。関連するインスタンス情報。このニーズを満たすために、シングルトン パターンを使用できます。シングルトン パターンでは、クラスにインスタンスが 1 つだけ存在することが保証され、そのインスタンスにアクセスするためのグローバル アクセス ポイントが提供されます。

具体的には、シングルトン パターンは通常、クラスの唯一のインスタンスを返す静的メソッド (getInstance() など) を提供します。このメソッドは静的であるため、クラスのインスタンスを作成せずに呼び出すことができます。これは、クラスにアクセスできるコードはすべて、この静的メソッドを呼び出すことでシングルトン インスタンスを取得できることを意味します。

1.2 目的

この記事では、シングルトン パターンの基本概念と実装手順を詳しく紹介します。この記事を通じて、シングルトン パターンがどのように機能するかを理解し、実際のプロジェクトでそれを効果的に活用する方法を学ぶことができます。

2. シングルトンパターンとは何ですか?

興味深い例を挙げると、シングルトン モデルはアニメの世界における主人公の後光のようなもので、プロットがどのように展開しても、主人公は常に 1 人だけであり、彼が物語の核であることは誰もが知っています。こうすることで、物語がどのように展開しても、誰もがプロットを前進させる同じ人物を見つけることができます。

2.1 シングルトンパターンの長所と短所

アドバンテージ

単一インスタンスを確保する: インスタンスの重複作成を回避し、リソースを節約します。
グローバルアクセスポイント: 便利なグローバル アクセスと簡素化された通話。
遅延初期化: オンデマンドでインスタンスを作成してパフォーマンスを向上させます。

欠点がある

スケーリングが難しい: シングルトン クラスは、コンストラクターがプライベートであるため、拡張するのが難しいことがよくあります。
潜在的なパフォーマンスの問題: 同時実行性の高い環境では、一部の実装でパフォーマンスの問題が発生する可能性があります。
テストの難しさ: シングルトン パターンはグローバルな状態であるため、テストが困難になる可能性があります。

2.2 シングルトンモードの利用シナリオ

シングルトン パターンの特性に応じて、その使用シナリオは次のカテゴリに分類できます。

  • たとえば、リソース共有の場合、構成ファイル データとログ ファイルをファイルに配置すると、これらの構成データまたはログ ファイルがシングルトン オブジェクトによって均一に読み取られ、サービス プロセス内の他のオブジェクトがこのシングルトンを渡します。オブジェクトはこの構成情報を取得するため、複雑な環境での構成管理を簡素化できます。
  • スレッド プールなどのリソースを制御する場合、マルチスレッド スレッド プールの設計では通常、プール内のスレッドの制御を容易にするためにシングルトン モードが採用されます。

3. シングルトンモードの実装モード

シングルトン パターンの実装には通常、次の 3 つの要素が含まれます。

  1. プライベートコンストラクター、クラスのコンストラクターをプライベートにして、外部が new キーワードを通じてインスタンスを作成できないようにします。
  2. プライベート静的参照は独自のインスタンスを指します、クラス内に静的インスタンス変数を作成して、一意のインスタンスを保存します。
  3. 独自のインスタンスを返すパブリック静的メソッド、外部がこのメソッドを通じて唯一のインスタンスを取得できるように、静的メソッドを提供します。

3.1 飢えた中国人のシングルトンパターン

Hungry スタイルのシングルトン モードの場合、クラスのロード時にシングルトン インスタンスが構築されます。クラスのロード時に静的オブジェクトが作成されるためスレッドセーフであり、呼び出されたときの応答速度が高速です。欠点も明らかであり、クラスの他の静的メソッドが実行されている限り、またはクラスがロードされている限り、このインスタンスは初期化されます。

/**    
 * 饿汉单例模式:在还没有实例化的时候就初始化
 */
public class Hungry {    
  	//1. 开始时就创建实例
	private static final Hungry instance=new Hungry();
	
	// 2. 私有化的构造方法
	private void hungry() {  
	}
	
	public static Hungry getInstance() { 
		// 返回单例名
		return instance;  		
	}
}