単一の実施形態の実装
一般的
1、道空腹の男
サンプルコード:
com.mt.singletonパッケージ;
/ **
飢えの*シングルトンデザインパターンの実装
*スレッドセーフ、効率的な高いコールを、しかし、遅延がロードを達成することはできません
* MT @author
*
* /
パブリッククラスSingletonDemo1 {
プライベート静的SingletonDemo1のS = SingletonDemo1新しい新しい();
//コンストラクタ民営
プライベートSingletonDemo1(){ } //オブジェクトを取得する一般的な方法を追加ロード遅らせない )のgetInstance(SingletonDemo1パブリックstatic { Sを返します; }
/ **
飢えの*シングルトンデザインパターンの実装
*スレッドセーフ、効率的な高いコールを、しかし、遅延がロードを達成することはできません
* 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を返します }
/ **
実装の*怠惰なシングルトンデザインパターンモード
*スレッドセーフで、遅延ロードが、コールは効率的ではありません
* 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; }
/ **
静的内部クラスの実装の*デザインパターン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を(){ }
/ **
実装の*列挙設計パターンSingletonパターン
*スレッドセーフな、高効率の呼び出しは、しかし、遅延ロードを実装していません
* @author MT
*
* /
{パブリック列挙SingletonDemo4 金を定義します//要素については、それ自体は単一の列挙型の実施形態のある INSTANCE; //操作法追加 公共ボイドinstanceOperateを(){ }
}
5、ダブルチェックロックモードを(ほとんど使用されない、お勧めしません)
反射防止およびデシリアライゼーション2つの単一モードの実施例
パッケージcom.mt.singleton。
輸入java.io.ObjectStreamException。
インポートしたjava.io.Serializable;
インポートしたjava.io.Serializable;
/ **
*飢えのシングルトンデザインパターンの実装
*スレッドセーフ、効率的な高いコールを、しかし、遅延は負荷を達成することはできません
* @author MT
*
* /
publicクラスSingletonDemo6実装 Serializableを {
プライベート静的SingletonDemo6新しい新しいSingletonDemo6 S =を();
//コンストラクタ民営
プライベートSingletonDemo6(){
(S = nullを!)IF {
新しい新しいのRuntimeExceptionを(投げる);
}
}
//オブジェクトを取得するための一般的な方法を追加し、ない遅延ロード
のpublic staticは(のgetInstanceをSingletonDemo6){
Sを返します;
}
オブジェクトはreadResolve公開は()にObjectStreamExceptionsをスローした
{
Sを返します;
}
*飢えのシングルトンデザインパターンの実装
*スレッドセーフ、効率的な高いコールを、しかし、遅延は負荷を達成することはできません
* @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。
輸入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)。 }
*シングルトンパターン(反射を防止し、逆シリアル化する)
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つは相対的に言って、似ています。