シングルトンデザインパターンの学習モード

単一の実施形態の実装

一般的

1、道空腹の男

サンプルコード:

com.mt.singletonパッケージ;
/ **
 飢えの*シングルトンデザインパターンの実装
 *スレッドセーフ、効率的な高いコールを、しかし、遅延がロードを達成することはできません
 * MT @author
 *
 * /
パブリッククラスSingletonDemo1 {
 プライベート静的SingletonDemo1のS = SingletonDemo1新しい新しい();
 //コンストラクタ民営
 プライベートSingletonDemo1(){  }  //オブジェクトを取得する一般的な方法を追加ロード遅らせない )のgetInstance(SingletonDemo1パブリックstatic {   Sを返します;  }
  



  

}

2、怠惰な方法

サンプルコード:

com.mt.singletonパッケージ;
/ **
 実装の*怠惰なシングルトンデザインパターンモード
 *スレッドセーフで、遅延ロードが、コールは効率的ではありません
 * MT @author
 *
 * /
パブリッククラスSingletonDemo2 {
 プライベート静的SingletonDemo2 S;
 //民営コンストラクタ
 プライベートSingletonDemo2(){  }  //オブジェクトを取得するための一般的な方法を追加し、同期メソッド呼び出しは、レターデーションのロード、低い効率である パブリック静的に同期SingletonDemo2のgetInstance(){   IF(S == NULL){    S =新しい新しいSingletonDemo2を();   }   ; Sを返します }
  







}

3、静的な内部クラスの道

サンプルコード:

com.mt.singletonパッケージ変更のための;
/ **
 静的内部クラスの実装の*デザインパターンSingletonパターン
 *スレッドセーフ、高コール効率、遅延ロード
 * @author MT
 *
 * /
パブリッククラスSingletonDemo3 {
 //静的な内部クラス
 静的クラスInnerClass {プライベート   プライベート静的最終SingletonDemo3新しい新しいSingletonDemo3のSC =();  }  //コンストラクタ民営 プライベートSingletonDemo3(){  }  //ロード遅延を達成するために、オブジェクトを取得する一般的な方法を追加 )のgetInstance(SingletonDemo3パブリックstatic {   InnerClassを返します.sc;  }
  

 



  



  

}

4、列挙実装

サンプルコード:

用com.mt.singleton Package変更;
/ **
 実装の*列挙設計パターンSingletonパターン
 *スレッドセーフな、高効率の呼び出しは、しかし、遅延ロードを実装していません
 * @author MT
 *
 * /
{パブリック列挙SingletonDemo4  金を定義します//要素については、それ自体は単一の列挙型の実施形態のある INSTANCE;  //操作法追加 公共ボイドinstanceOperateを(){  }
 


 


 
}

5、ダブルチェックロックモードを(ほとんど使用されない、お勧めしません)

 

反射防止およびデシリアライゼーション2つの単一モードの実施例

 

パッケージcom.mt.singleton。
輸入java.io.ObjectStreamException。
インポートしたjava.io.Serializable;
/ **
 *飢えのシングルトンデザインパターンの実装
 *スレッドセーフ、効率的な高いコールを、しかし、遅延は負荷を達成することはできません
 * @author MT
 *
 * /
publicクラスSingletonDemo6実装 Serializableを {
 プライベート静的SingletonDemo6新しい新しいSingletonDemo6 S =を();
 //コンストラクタ民営
 プライベートSingletonDemo6(){
  (S = nullを!)IF {
   新しい新しいのRuntimeExceptionを(投げる);
  }
  
 }
 //オブジェクトを取得するための一般的な方法を追加し、ない遅延ロード
 のpublic staticは(のgetInstanceをSingletonDemo6){
  
  Sを返します;
 }
 オブジェクトはreadResolve公開は()にObjectStreamExceptionsをスローした
 {
  Sを返します;
 }
}
認証コード:
パッケージcom.mt.test。
輸入java.io.FileInputStream;
輸入java.io.FileOutputStreamは、
輸入java.io.ObjectInputStream。
輸入java.io.ObjectOutputStreamの。
輸入java.lang.reflect.Constructor。
輸入com.mt.singleton.SingletonDemo6。
/ **
 *シングルトンパターン(反射を防止し、逆シリアル化する)
 MT @author *
 *
 * /
publicクラスクライアント{
 公共の静的な無効メイン(文字列[]引数)は例外{スロー
  SingletonDemo6 SingletonDemo6.getInstance S1 =()を、
  SingletonDemo6 S2 SingletonDemo6.getInstance =();
  のSystem.out.println(S1)
  のSystem.out.println(S2);
 / * //反射防止
  //取得するクラス・オブジェクト・
  クラス<SingletonDemo6> clazz =(クラス <SingletonDemo6>)クラス。 forName( "com.mt.singleton.SingletonDemo6");
  //取得コンストラクタオブジェクト
  コンストラクタを<SingletonDemo6> C = clazz.getDeclaredConstructor(NULL);
  //コンストラクタ民営アクセス
  (真の)c.setAccessible;
  SingletonDemo6 S3 = C .newInstance();
  SingletonDemo6 c.newInstance S4 =();
  System.out.println(S3)。
  System.out.println(S4); * /   //防止反序列化  のFileOutputStream OS =新しいのFileOutputStream( "D:/a.txt");   ObjectOutputStreamのOOS =新しいObjectOutputStreamの(OS);   oos.writeObject(S1)。  oos.close();   os.close();   ObjectInputStreamのOIS =新しいObjectInputStreamの(新規のFileInputStream( "D:/a.txt"));   SingletonDemo6 S3 =(SingletonDemo6)ois.readObject();   System.out.println(S3)。 }
  









 
  
}
 
概要:いくつかの効率、怠惰な方法で最も遅い、怠惰な同期方法を達成するために、時々待ちのプロセスに関与するが、他の3つは相対的に言って、似ています。
 

おすすめ

転載: www.cnblogs.com/MTAngel/p/10991308.html