みなさんこんにちは、javaRush!
今回はデザインパターン
Singleton
(シングル)についてご紹介します。
目標:オブジェクトを 1 つだけ持つクラスを作成します。これは、何度アクセスしても、最初に作成されたのと同じオブジェクトが返されることを意味します。これは便利であり、多くの場所で必要なため、フレームワークに実装されているのは当然です。
応用:
- たとえば、データベースをプロジェクトと、データベースへの接続を担当するクラスに接続する必要があります。接続は一度作成すれば、何度も作成する必要はありません
Application settings
— アプリケーションに必要な接続設定を担当するクラス: データベースのホストやポートなど。これらは一度作成されると、アプリケーションの動作全体を通じて使用されます。
- 私が言及していない例が他にもたくさんあるので、コメントにオプションを書いてください。=)
この導入の後で、私が理解しているように、このクラスの例を示すことができます: (私たちそれぞれがこれの実装を思いつくことができると確信していますが) 以下は、コンストラクターをプライベートにするときの最も単純な例です。オブジェクトを明示的に作成することはできません。
getInstance()
そして、オブジェクトを提供する 静的メソッドがあります。
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
マルチスレッドには問題があるため、
getInstance()
マーカーメソッドを追加できます
synchronized
。
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
最後に、いつものように、違う考えや私の間違いを見つけた場合は、コメントに書き込んでください。喜んですべてについて話し合います :) 記事が気に入った場合は、「+」と書いてください。これは私にとって重要です :) PS 実装をさらに追加しています:
Joshua Blochによると、これがテンプレートを実装する最良の方法です
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
そしてさらに
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
遅延初期化
+
高いパフォーマンス
-
非静的クラス フィールドには使用できません 質問/提案があれば、コメントに書き込んでください。
私の他の記事も参照してください。
GO TO FULL VERSION