この記事は、デザイン パターンの概念に初めて遭遇した人、シングルトンという用語を聞いたことがある人、または何らかの形でシングルトン パターンを実装したものの、何が起こっているのか理解できなかった人を対象としています。いらっしゃいませ!CodeGym の学生は、レベル 15 で初めて設計パターンに遭遇します。そのとき、キャプテンは予期せず、Java シングルトン パターンを遅延実装で実装することで理解を「強化」するように求めました。シングルトンパターンについて初めて聞いた学生は、すぐに多くの質問をします。デザイン パターンとは一体何ですか? なぜそれが必要なのでしょうか? シングルトンとは何ですか? 最後に、遅延実装とは何ですか? これらの質問に順番に答えてみましょう。
シングルトンパターンはそのうちの 1 つにすぎません。
ブラックジャックと数字を使用して独自の並べ替えアルゴリズムを作成できます。それには多くの時間を費やすか、長い間理解され説明されてきたものを実装することもできます。デザインパターンも同様です。さらに、デザイン パターンを使用すると、コードがより標準になり、パターンによくある落とし穴がずっと前に特定され、排除されているため、適切なパターンを使用すると間違いを犯す可能性が低くなります。何よりも、パターンの知識は、プログラマーがお互いをよりよく理解するのに役立ちます。他のプログラマに長々と説明する代わりに、パターンの名前を言うだけで済みます。要約すると、デザイン パターンは次のことに役立ちます。
このセクションの結論として、デザイン パターン全体が 3 つの大きなグループに分類できることに注意してください。
デザインパターンとは一体何でしょうか?
この質問に最もよく理解して答えるためには、少し歴史を知ることが必要だと思います。興味深いアイデアを思いついた 4 人の有名なプログラミング作者 (Erich Gamma、John Vlissides、Ralph Johnson、Richard Helm) がいます。彼らは、ソフトウェア開発では、ほぼ同じ問題を解決し、同じ方法で構造化されたコードを書くことが必要になることが多いことに気づきました。そこで彼らは、オブジェクト指向プログラミングで頻繁に使用する必要がある典型的なパターンを説明することにしました。彼らの本は、「Design Patterns: Elements of Reusable Object-Oriented Software」というタイトルで 1994 年に出版されました。この本の名前が長すぎることが判明し、人々はそれを単にギャング・オブ・フォーの本と呼ぶようになりました。初版には23柄が収録されていました。その後、他にも数十のパターンが発見されました。デザイン パターンは、一般的な問題に対する標準化された解決策です。 |
なぜデザインパターンが必要なのでしょうか?
パターンを知らなくてもプログラミングはできます。結局のところ、レベル 15 までに、その存在さえ知らずに CodeGym で何百ものミニプログラムをすでに書いていることになります。これは、デザイン パターンが、その使い方によって熟練者とアマチュアを区別する一種のツールであることを示唆しています。デザイン パターンは、典型的な問題を適切に解決する方法を記述します。これは、パターンを知ることで時間を節約できることを意味します。その意味では、それらはアルゴリズムに似ています。たとえば、
|

最後にシングルトンパターン
シングルトンは作成パターンです。このパターンでは、クラスのインスタンスが 1 つだけ存在することが保証され、このオブジェクトにグローバル アクセス ポイントが提供されます。説明から、このパターンは次の 2 つの場合に適用されることが明らかです。- プログラムで特定のクラスのオブジェクトを 1 つだけ作成する必要がある場合。たとえば、コンピュータ ゲームには、Hero クラスと、ゲーム内の唯一のヒーローを記述する Hero オブジェクトが 1 つだけある場合があります。
- オブジェクトへのグローバル アクセスのためのポイントを提供する必要がある場合。つまり、プログラム内のどこからでもオブジェクトを利用できるようにする必要があります。残念ながら、グローバル変数は書き込み保護されていないため、単に作成するだけでは十分ではありません。誰でも変数の値を変更できるため、オブジェクトのグローバル アクセス ポイントが失われる可能性があります。シングルトンのこれらのプロパティは、たとえば、データベースと連携するオブジェクトがあり、プログラムのさまざまな部分からデータベースにアクセスする必要がある場合に必要です。シングルトンは、以前に作成されたインスタンスを置き換えるコードを誰も書かないようにします。
-
遅延初期化を使用したシングルトンの例を見つけてください。
-
同じ原理を使用して、3 つのシングルトン クラス (Sun、Moon、Earth) を別々のファイルに作成します。
-
埋め込む星Sun、Moon、Earthクラスのインターフェイス。
- Solutionクラスの静的ブロックで、readKeyFromConsoleAndInitPlanet方法。
-
を実装します。readKeyFromConsoleAndInitPlanetメソッドの機能:
-
5.1. コンソールから1 つの文字列パラメータを読み取ります
-
5.2. パラメータが次のいずれかに等しい場合、星インターフェイスの定数を使用して、適切なthePlanetオブジェクトを作成します。
-
-
単一のオブジェクトを格納するプライベート静的フィールドをクラスに与える必要があります。
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; // #1 }
-
(デフォルト) コンストラクターをプライベートにします。これは、クラスの外部からアクセスできず、新しいオブジェクトを返すことができないことを意味します。
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton(){} // #2 }
-
シングルトンを取得するために使用される静的作成メソッドを宣言します。
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton() {} public static LazyInitializedSingleton getInstance() { // #3 if (instance == null) { // If the object has not yet been created instance = new LazyInitializedSingleton(); // Create a new object } return instance; // Return the previously created object } }
GO TO FULL VERSION