ホームページ >バックエンド開発 >C#.Net チュートリアル >シングルトンパターンと一般的な書き方の分析(デザインパターン01)

シングルトンパターンと一般的な書き方の分析(デザインパターン01)

黄舟
黄舟オリジナル
2017-02-13 11:39:291290ブラウズ

クラスにインスタンスが 1 つだけあることを確認し、インスタンスへのグローバル アクセス ポイントを提供します。

——「デザインパターン」

シングルトンパターンの概念は非常に単純で、例として C# 言語を使用して、一般的なシングルトン記述方法の長所と短所をリストします。

1. 単純な実装

 public sealed class Singleton
    {
        static Singleton instance = null;

        public void Show()
        {
            Console.WriteLine(  "instance function");
        }
        private Singleton()
        {
        }

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }

コメント:


スレッドにとって安全ではありません
要件はシングルスレッドで満たされます
利点:
インスタンスはインスタンス内にあるため、プロパティ クラスが追加機能を使用できるようにメソッド内で内部的に作成されます
オブジェクトがインスタンスを必要とするまでインスタンス化は実行されません。このアプローチは「遅延インスタンス化」と呼ばれます。遅延インスタンス化により、アプリケーションの起動時にシングルトンの不必要なインスタンス化が回避されます。


2. スレッドの安全性

public sealed class Singleton
    {
        static Singleton instance = null;
        private static readonly object padlock = new object();

        private Singleton()
        {
        }

        public static Singleton Instance
        {
            get
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }

                return instance;
            }
        }
    }



コメント:

同じのみ1 つのスレッドはプログラムのロックされている部分に入ることができます
オブジェクトインスタンスは最初に入ったスレッドによって作成されます
後のスレッドは入ったときにオブジェクトインスタンスを再度作成しません (instance == null) +
スレッドは毎回ロックされません
インスタンスは許可されます 初期化オブジェクトが最初にアクセスされるまで遅延されます


4. 静的初期化

 public sealed class Singleton
    {
        static Singleton instance = null;
        private static readonly object padlock = new object();

        private Singleton()
        {
        }

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }

コメント:


共通言語ランタイム上の DS ハンドル変数の初期化
パブリック静的プロパティは、インスタンスにアクセスするためのグローバル アクセス ポイントを提供します
インスタンス化メカニズム (.NET によって実装される) に対する制御が少なくなります

静的初期化は、.NET でシングルトンを実装するための推奨される方法です

ちょっとしたメモ:

静的コンストラクターにはアクセス修飾子がありません。C# は自動的にプライベートとしてマークする必要がある理由は、開発者がそれを呼び出すことを防ぐためであり、その呼び出しは常に です。 CLR の責任。 5 、遅延初期化

 public sealed class Singleton
    {
        private static readonly Singleton instance = null;
        static Singleton()
        {
            instance = new Singleton();
        }
        private Singleton()
        {
        }
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }

コメント:



初期化作業は Nested クラスの静的メンバーによって完了されるため、遅延初期化が実現されます。

クラスがインスタンス化されるとき、または静的メンバーが呼び出されるときに静的関数が呼び出されるため、

と .net フレームワークは静的コンストラクターを呼び出して静的メンバー変数を初期化します

したがって、4 番目のメソッドに従って記述した場合、Hello メソッドを呼び出すと、シングルトン インスタンスがインスタンス化されます。これは、私たちが望むものではありません。他に何か。

注:

1. Singleton パターンのインスタンス コンストラクターを protected に設定して、サブクラスの派生を許可できます。
2. シングルトン モードは、通常、ICloneable インターフェイスをサポートしません。これは、シングルトン モードの本来の目的に反して、複数のオブジェクト インスタンスが生成される可能性があるためです。
3. シングルトン モードは通常、シリアル化をサポートしません。これは、複数のオブジェクト インスタンスが発生する可能性もあり、これもシングルトン モードの本来の目的に反するからです。
4. Singletom モードでは、オブジェクトの作成の管理のみが考慮され、オブジェクトの破棄の管理は考慮されません。ガベージ コレクションとオブジェクトのオーバーヘッドをサポートするプラットフォームに関しては、通常、オブジェクトの破棄について特別な管理を行う必要はありません。


概要:

1. シングルトン パターンは、クラスの作成を改善するのではなく、制限します。
2. Singleton パターンの理解と拡張の核心は、「new を使用してクラスのコンストラクターに対するユーザーの任意の呼び出しを制御する方法」です。
3. シングルトンをいくつかのインスタンスを持つように簡単に変更できます。これは許可されており、意味があります。


上記は、単一ケースパターンと一般的な文章分析(デザインパターン01)の内容です。その他の関連コンテンツについては、PHP中国語Webサイト(www.php.cn)にご注意ください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。