免責事項:この記事はブロガーオリジナル記事です、ソースを明記してください。Javaのノートシェア(xiaosen_javashare)https://blog.csdn.net/qq_36447151/article/details/87602801:国民の関心番号へようこそ
シングルトン
その唯一の特定のクラスのインスタンス、及びそれら自身の例を確保し、システム全体のインスタンスを提供することを目的とします。コンストラクタの民営化は、それが新しいことはできません。
商品コード:Githubに
シングルトンの応用
利点
- メモリコストを削減し、メモリ内の唯一のインスタンスを、
- オブジェクトを生成するときには、依存性が他のオブジェクトを生成する、このような構成を読み取るように、より多くのリソースを必要とするアプリケーションの起動時に直接シングルトンオブジェクトによって生成され、次いで、メモリ常駐を解決するための恒久的な方法もよいです
- メモリ内の唯一のインスタンスが存在するので、シングルトンパターンは、同時にファイル書き込み操作で同じリソースを回避するために、リソースの複数の割り当て、例えばファイルとして書き込ま運動を回避します。
- メモリ内の唯一のインスタンスが存在するので、シングルトンパターンは、同時にファイル書き込み操作で同じリソースを回避するために、リソースの複数の割り当て、例えばファイルとして書き込ま運動を回避します。
短所
- シングルトンインタフェースは、一般的に非常に難しい展開されません。
- 試験のSingletonパターンは負です。並行開発環境では、単一の実施形態のモードが完了していない場合は、インタフェースは、仮想モック方法のオブジェクトを使用することはできません、テストには使用できません。
- シングルトンと単一責任原則の競合。
いくつかの単一の実施形態が実装さ:
1、空腹の男性モード
public class SingleDemo {
private static SingleDemo instance = new SingleDemo();
//私有化构造器
private SingleDemo() {
//防止其他通过反射调用构造方法,破解单例
if (instance != null) {
throw new RuntimeException();
}
}
//对外提供统一的访问点
public static SingleDemo getInstance() {
return instance;
}
}
利点:
- セキュリティスレッドを確保するために、クラスのインスタンスは、JVMの時間によってロードされて初期化します
- シンプルで便利な、高いアクセス効率
短所:
- リソース使用率が高くない、遅延ロードを達成することはできません
2、怠惰なモード
public class SingleDemo2 {
// 此处并不初始化实例
private static SingleDemo2 instance;
private SingleDemo2() {
if (instance != null) {
throw new RuntimeException();
}
}
/**
* 当调用此方法的时候才初始化实例, 为了实现线程安全,需要使用同步方法
*/
public static synchronized SingleDemo2 getInstance() {
if (instance == null) {
instance = new SingleDemo2();
}
return instance;
}
}
利点:
- 唯一のリソース使用率を最適化し、それはインスタンスを初期化され、このクラスを使用します
短所:
- スレッドセーフ達成するために、オーバーヘッドのアクセスの増加を得るために同期方法を使用します
3、ダブルチェック
public class SingleDemo3 {
private static SingleDemo3 instance;
private SingleDemo3() {
if (instance != null) {
throw new RuntimeException();
}
}
public static SingleDemo3 getInstance() {
//第一重检查,提高效率
if (instance == null) {
synchronized (SingleDemo3.class) {
//第二重检查保证线程安全
if (instance == null) {
instance = new SingleDemo3();
}
}
}
return instance;
}
}
利点:
- 遅延ロードを実装
- 同期領域と最初のチェックを減らすことによって、アクセス効率を向上させます
短所:
- スレッドセーフ達成するために、オーバーヘッドのアクセスの増加を得るために同期方法を使用します
4、静的内部クラス
public class SingleDemo4 {
private static SingleDemo4 instance;
private static class SingleDemo4Holder {
private static final SingleDemo4 instance = new SingleDemo4();
}
private SingleDemo4() {
if (instance != null) {
throw new RuntimeException();
}
}
/**
* 调用这个方法的时候,JVM才加载静态内部类,才初始化静态内部类的类变量。由于由JVM初始化,保证了线程安全性,
* 同时又实现了懒加载
*/
public static SingleDemo4 getInstance() {
return SingleDemo4Holder.instance;
}
}
利点:
- すなわち、スレッドセーフを達成するために、だけでなく、遅延ロードを達成するために
短所:
- 少し複雑を達成
5、列挙クラス
public enum SingleDemo5 {
INSTANCE;
public void someMethod(){
}
}
利点:
- シンプル
- スレッドセーフ
短所:
- レイジーローディングは達成できません
結論
あなたが列挙を使用する必要がない場合は、静的な内部クラスの道の使用上の遅延ロードが必要な場合
拡張Singletonパターン
クラスが必要な場合にのみインスタンスの固定数を生産。
public class SingleDemo6{
// 最多可以生成的单例数量
private static int maxNumberSingleDemo = 2;
// 定义列表存放实例
private static List<SingleDemo6> singleDemoList = new ArrayList<>();
//生成对象
static{
for(int i=0; i<maxNumberSingleDemo; i++){
singleDemoList.add(new SingleDemo6());
}
}
private SingleDemo6(){}
public static SingleDemo6 getInstance(){
Random random = new Random();
//随机调用一个实例
int number = random.nextInt(maxNumberSingleDemo);
return singleDemoList.get(number);
}
}
パターンオブジェクトの固定された数を生成するために、この必要性は、シングルモードでの拡張であり、蓋をし、マルチモードの実施例を、と呼ばれる、マルチキャップした実施の形態の使用は、設計に我々はメモリにどのように多くのインスタンスを決めることができ、システムを展開するために、単一の訂正能力の問題は、実施の形態で存在し得る簡単な、システムの応答速度が提供されます。このようなファイルを読み込むように、我々はシステムでの作業を完了することができ、最初はあなたがファイルを読むために必要がある場合、あなたは迅速に対応することができ、メモリにリーダーインスタンスの固定数を開始しています。
国民の関心番号へようこそ。