4

私は、共同開発者 (および以前の開発者) の 1 人が、内部に多くのメソッド呼び出しがあるクラスのほぼすべてのページに Singleton/Facade を使用するプロジェクトに取り組んでいますが、実際にはそれを維持していません。データ。

例えば:

public class FooFacade
{
    private static FooFacade m_facade = null;
    private static DataAccessManager m_dataAccessMgr = null;

    public StringBuilder Status {get; set; }

    private FooFacade()
    {
        this.Status = new StringBuilder();
    }

    public static FooFacade getInstance()
    {
        if (m_facade == null)
        {
            m_dataAccessMgr = DataAccessManager.getInstance();
            m_facade = new FooFacade();
        }

        return m_facade;
    }

    public void clearStatus()
    {
        this.Status.Remove(0, Status.Length);
    }

 public void Method1(string value1, int value2)
    {
     // DO SOMETHING
    }


 public List<string> Method2(string value1, int value2)
    {
     // DO SOMETHING ELSE
     // RETURN LIST
    }

さて、命名規則と、Facade と同じクラス内に Singelton があるという事実と、Facade が実際には Facade ではないという事実に、特定の問題があります。(しかし、それはまったく別の会話です)。

したがって、私の質問は、これによって本当にメリットがあるかどうかです。開発者が説明できる最善のことは、オブジェクトを常に作成および破棄するわけではないため、メモリ管理に適しているということです。

私たちのアプリケーションはエンタープライズ レベルのアプリではなく、メモリに問題はありません。サイトが遅いときはいつでも、コードではなくデータベースが原因です。

ご協力いただきありがとうございます。私は、なぜ自分をより良い開発者にするのかを知りたがる開発者です。意味のある言葉で開発者からそれを得ることができないので、私はあなたたちに手を差し伸べています.

ありがとう、チャド

更新 以下のコメントのおかげで、重大なセキュリティ上の欠陥である可能性があるため、ステータスが深刻な懸念事項であることを知っています. メモリ管理や速度などに関して、シングルトンでこのコードを使用する利点はありますか? または、必要なたびに FooFacade をインスタンス化する方が簡単でしょうか。

4

3 に答える 3

6

オブジェクトには内部状態(Status)があるため、問題が発生しています。具体的には、シングルトンが複数のスレッド内から使用された場合(たとえば、Webアプリで)、コードはおそらく機能しません。

シングルトンは、内部状態のないクラスがある場合にのみ使用してください。

于 2012-01-09T18:53:19.113 に答える
2

メモリ管理や速度などに関して、シングルトンでこのコードを使用する利点はありますか? または、必要なたびに FooFacade をインスタンス化する方が簡単でしょうか。

このタイプのインスタンスに含まれるものはすべて、への参照StringBuilderです。また、新しいインスタンスが作成されるときに重労働が発生することはありません (DataAccessManager.getInstance()舞台裏で厄介なことが行われない限り)。いいえ、メモリ管理や速度などの点で具体的なメリットはありません。必要なときに新しいインスタンスをインスタンス化するだけです。(というか、このクラスを完全に取り除こうとします...)

于 2012-01-09T21:46:55.450 に答える
1

複数のコンシューマー間で共有される特定のファイルなど、シングルトンとして存在する必要があるもののシングルトンパターンを保存します。シングルトンは通常、スレッドの問題を切り分けることを含みます。ただし、状態を含まず、シングルトンパターンで実装されているクラスがある場合は、簡単にアンチパターンになる可能性のあるユーティリティクラスを実装しています。良い考えではありませんが、静的メソッドを持つ静的クラスの方がパフォーマンスが優れていたでしょう。静的メソッドは、メソッドを呼び出す前にnullチェックの必要性を排除します。しかし、最初に言ったように、シングルトンでなければならないものにはシングルトンパターンを残します。

于 2012-01-09T21:59:44.213 に答える