作成された時間に応じてデザインシングルトンデザインパターン空腹(比較的緊急使用)中国風、怠惰(作成するために必要な場合にのみ、怠け者)中国風
飢え式の一般的な形式
- 直接インスタンス化(視覚的に比較プロファイル)
- 列挙された(最もシンプル)
- コードの飢え式静的ブロック(複合体の例)
怠惰なスタイルの一般的な形式
- スレッドセーフ(シングルスレッドに適し)
- スレッドセーフ(に適したマルチスレッド)
- (マルチスレッドのための)静的内部クラス
①飢え式は直接サンプルコードは、インスタンス化
public class Singleton1 {
public static final Singleton1 INSTANCE=new Singleton1();
private Singleton1(){
}
}
②列挙型
public enum Singleton2 {
INSTANCE
}
③静的コードブロック
public class Singleton3 {
public static final Singleton3 INSTANCE;
static {
INSTANCE=new Singleton3();
}
private Singleton3(){
}
}
(シングルスレッドプログラム用)④怠惰なスタイルのスレッドセーフ
public class Singleton4 {
public static Singleton4 instance;
private Singleton4(){
}
public static Singleton4 getInstance(){
if (instance==null){
instance=new Singleton4();
}
return instance;
}
}
④上記方法のマルチスレッディングは、セキュリティスレッドを引き起こすことが、複数のスレッドがオブジェクトの複数の例では、結果として、新しいインスタンスを実行した場合、その後に入力されていてもよいです。解決策は、新しいインスタンス化を行っている場合のみ、1スレッドが入ることができる性を保証をロックすることです
⑤スレッドセーフ
public class Singleton5 {
public static Singleton5 instance;
private Singleton5() { }
public static Singleton5 getInstance() {
if (instance == null) {//提高效率加的判断
synchronized (Singleton5.class) {
if (instance == null) {
instance = new Singleton5();
}
}
}
return instance;
}
}
⑥静的な内部クラス
静的な内部クラスの特徴
- オブジェクトのみ内部クラスローディング及び初期化のINSTANCEインスタンスを作成します
- 静的な内部クラスが自動的にロードされ、外部クラスで初期化されることはありません、JDKがロードされ一人で行くと初期化されます
public class Singleton6 {
private Singleton6(){ }
private static class InnerClass{
private static final Singleton6 INSTANCE=new Singleton6();
}
public static Singleton6 getInstance(){
return InnerClass.INSTANCE;
}
}