2009-04-06 15 views
12

すべての静的メンバー/メソッドを持つクラスは、シングルトンデザインパターンの一種ですか?特にそのようなクラスを持っていることには何らかの欠点がありますか?詳細な説明が役立ちます。静的クラスとシングルトン

答えて

17

この種類のクラスはmonostateとして知られています。これはシングルトンとは多少異なります。

なぜシングルトンではなくモノスタットを使用するのですか?パターン上の彼らのoriginal paperでは、ベル&クロフォードは(私が言い換え)3 reasonns勧め:

  • より自然なアクセス構文
  • をシングルトンは

からIを継承しやすい名前

  • を欠い私はこれらのどれも特に魅力的であるとは思わない。一方、モノスタットは間違いなくであり、シングルトンよりも悪いのはです。

  • +0

    異なるのですが、まったく同じことを達成していませんか? C++では、これが "伝統的な"シングルトンに比べてどのように長所と短所を持っているかはわかりません。 –

    +0

    シングルトンが使用されない限り、スペースは割り当てられないという違いがありますが、実際に使用されないシングルトンオブジェクトはまれなケースのようです。誰かがこれが重要となる共通のユースケースを持っていますか? –

    +0

    また、私は、典型的なシングルトンの遅延構築機能は、ほとんどの場合、大域的な変数が必要なものでは役に立たないと考える傾向があります。しかし、ライブラリの場合、エンドユーザーの(開発者の実際の)コードを簡素化するために、オンザフライでの構築が必要な場合があります。 –

    15

    ロバートC.マーティンは、モノステートパターンとシングルトンパターンの違いについて、何度か前にarticleと書いています。

    +1

    記事によれば、JavaではMonostateの破壊は保証されていますが、JVM間を渡すことはできません.C++に関連する違いはありますか? –

    +0

    他の変数とまったく同じです。動的に割り当てられている場合は、互換性のあるデアロケータで割り当てを解除する必要があります。静的記憶域にある場合(GOTW/XC++、IIRCを参照)、プログラムは破棄されて終了しますが、依存関係を実装する方法はありません。 –

    +0

    依存関係の側面に関しては、A.Alexandrescuのloki(MC++ Dからの)シングルトンとACEシングルトンは依存関係を指定することを許可します。ところで、彼らは両方とも非介入シングルトンです。 –

    0

    シングルトンの場合、すべてのコンストラクタはプライベートでなければならないため、関数を介してのみアクセスできます。しかし、あなたはそれにかなり近いです。

    すべての静的メンバ/メソッドを持つ
    +1

    間違った間違った間違った。 – Thomasz

    +0

    シングルトンについてもう一度読むべきだと本当に思っているならば。プライベートコンストラクタと1つまたは複数の静的メンバーのみpublicil関数を介してアクセスすることは、シングルトンの定義である – DaClown

    +1

    この回答が間違っていると5つのダウンボートが必要な場合は、コメントを残すことができますか? 「間違った間違った」のようなものは役に立ちません。私はまだ間違っているとは確信していません。 – DaClown

    1

    クラス シングルトンデザインパターン

    クラスのようなもの - ではない模様。クラスについて話すとき、クラスパターンを実装すると言うことができます。


    静的関数 - メンバー関数ではなく、グローバル関数でも同様です。多分あなたはクラスを必要としないでしょうか? wikipediaから

    引用:ソフトウェア工学において

    、シングルトン パターンは、1つのオブジェクトに クラスのインスタンスを制限するために使用されるデザインパターンです。この定義により

    はあなたの実装では、シングルトン実装ではありません - あなたは一般的なアイデアにクラスのつ(または拡張定義では、いくつかの)インスタンスを使用しないでください。

    しかし、すべての静的関数とシングルトンパターンを持つクラスの使用は(必ずしもそうではない)意味のある違いはありません。

    2

    ロギングクラスのファミリについて考えてみましょう。これらはすべて "LogMessage(message、file、line_number)"を実装しています。あるものはstderrにメッセージを送信し、あるものは開発者のセットにメールを送り、あるメッセージの頻度をメッセージ頻度テーブルに増やしたり、/ dev/null 。実行時に、プログラムは使用するロギング手法の引数ベクトル、レジストリまたは環境変数をチェックし、適切なクラスのオブジェクトを使用してロギングシングルトンをインスタンス化します。エンドユーザが提供するDLLをロードします。その機能は、純粋な静的なシングルトンと重複するのは難しいです。

    関連する問題