11

誰もがシングルトンデザインパターンのコードを書く方法を知っています。たとえば

public class Singleton  
{  
    // Private static object can access only inside the Emp class.  
    private static Singleton instance;  

    // Private empty constructor to restrict end use to deny creating the object.  
    private Singleton()  
    {  
    }  

    // A public property to access outside of the class to create an object.  
    public static Singleton Instance  
    {  
        get  
        {  
            if (instance == null)  
            {  
                instance = new Singleton();  
            }  
            return instance;  
        }  
    }  
}  

任意のクラスのインスタンスを何度も作成すると、メモリが各インスタンスに割り当てられることは非常に明白ですが、シングルトンデザインパターンの場合、単一のインスタンスがすべての呼び出しにサービスを提供します。

1)私は少し混乱していて、その理由が何であるかを実際には理解していません...シングルトンデザインパターンを選択する必要がある場合。いくつかのメモリまたは他の利点を節約するためだけに。

2)1つのプログラムに多くのクラスを含めることができるとしたら、どのクラスがシングルトンデザインパターンに従う必要がありますか?シングルトンデザインパターンの利点は何ですか?

3実際のアプリでは、シングルトンデザインパターンに従ってクラスを作成する必要があるのはいつですか?ありがとう

これがスレッドセーフなシングルトンです

public sealed class MultiThreadSingleton   
{   
    private static volatile MultiThreadSingleton instance;   
    private static object syncRoot = new Object();   

    private MultiThreadSingleton()   
    {   
    }   

    public static MultiThreadSingleton Instance   
    {   
        get   
        {   
            if (instance == null)   
            {   
                lock (syncRoot)   
                {   
                    if (instance == null)   
                    {   
                        instance = new MultiThreadSingleton();   
                    }   
                }   
            } 

        return instance;   
        }   
    }   
}
4

8 に答える 8

11

毎回オブジェクトの1つの同じインスタンスのみを保証するため。

シナリオを考えてみましょう。たとえば、会社のアプリケーションの場合、CEOは1人だけです。CEOオブジェクトを作成またはアクセスする場合は、毎回同じCEOオブジェクトを返す必要があります。

もう1つ、アプリケーションにログインした後、現在のユーザーは毎回同じオブジェクトを返す必要があります。

于 2012-10-15T18:32:03.590 に答える
8

他の答えも良いです。しかし、それらはパターンの動作特性の例を提供しています。しかし、シングルトンは創造に関するものです。したがって、このパターンの最も重要な利点の1つは、リソースに優しいことです。new object実際に新しいメモリを必要としないときに、メモリを無駄にすることはありません。

これにより、インスタンス化のオーバーヘッドが回避されるという別の利点が生じます。

于 2015-11-01T17:13:47.513 に答える
4

シングルトンパターンの利点:

•インスタンス制御:シングルトンは、他のオブジェクトがシングルトンオブジェクトの独自のコピーをインスタンス化するのを防ぎ、すべてのオブジェクトが単一のインスタンスにアクセスできるようにします。

•柔軟性:クラスはインスタンス化プロセスを制御するため、クラスにはインスタンス化プロセスを変更する柔軟性があります。

グローバル変数に対するシングルトンの利点は、シングルトンを使用するときにインスタンスの数を完全に確信できることです。また、考えを変えて、任意の数のインスタンスを管理できます。

于 2012-10-15T18:32:16.590 に答える
3

シングルトンデザインパターンのリアルタイムの使用法/利点。

  1. マルチスレッドを使用しているときに、マルチスレッドプールを管理します。
  2. SOA(サービス指向アーキテクチャー)で「サービスホストリポジトリ」を管理します。
  3. ロギングフレームワークの実装用
  4. 自動化テスト/ユニットテストプロジェクト、つまりコード化されたUIプロジェクト。
  5. 大きなアプリケーションでキャッシングを実装している間。
  6. アプリケーションを適切に制御するための構成設定用。
于 2017-02-28T06:14:09.180 に答える
2

シングルトンを使用するのに便利な場所の1つは、単一のアクセスポイントのみが必要なリソースにアクセスしている場合です。たとえば、デバイスと通信するためのコードを作成するときに使用しました。デバイスと通信するコードは1つだけにしたいので、シングルトンを使用します。デバイスと通信するオブジェクトの別のインスタンスを作成しようとすると、同じオブジェクトが返されるだけなので、2つのインスタンスがデバイスに関する非同期データを維持したり、デバイスとの間でメッセージが混在したりすることを心配する必要はありません。アップまたはアウトオブオーダー。

ただし、もちろん、それらを使用する義務はありません。それらは、時々役立つツールにすぎません。

于 2012-10-15T18:34:11.173 に答える
1

一般に、シングルトンはOOPではアンチパターンと見なされます。これは、クラスがプログラム全体(OOPでは知識がないはずです)に関して、それが唯一のプログラムになることを認識していることを意味するためです。そうは言っても、シングルトンは私の経験で定数を実装するための適切な方法です。一般に、プログラムにハードコーディングしようとしていたもの(データベースのユーザー名など)は、構成ファイルまたはシングルトンに移動できます。

JavaがC#に勝る数少ない分野の1つ(私の意見では...)は、列挙型のサポートです。Javaは列挙型を介して真にOO定数を提供するため、これが私が常にJavaでシングルトンを実装する方法です。C#には、すぐに使用できるものはありません。

于 2012-10-15T18:29:31.000 に答える
0

これにより、JVMでのメモリの処理方法が改善され、メモリが適切に使用されると、パフォーマンスが向上します。複数のオブジェクトを作成するのではなく、1つだけを作成しようとすると、ガベージコレクターの作業が減り、JVMヒープでのメモリ占有が減ります。

于 2019-11-24T18:05:46.680 に答える
-1

プリンタが1つあり、すべてがそのプリンタにアクセスする必要があると仮定します。オブジェクトを作成する間、uは、他の人が同時に印刷することを許可しないため、1人だけにアクセスを許可する必要があります。そのため、実際の状況では、単一のプリンタが必要です。より明確にタスクを1つずつ管理できるトンクラス...

于 2021-08-15T08:19:28.430 に答える