質問

または、別のデザインパターンを使用する方が良いですか

役に立ちましたか?

解決

数日前に同様の質問に回答こちら、モックシングルトン。元の投稿は、シングルトンの振る舞いをm笑することに関するC#.Net向けですが、まだ適用されるはずです。

シングルトンパターンに関しては、それ自体に問題はありません。多くの場合、ロジックとデータを集中化する必要があります。ただし、シングルトンクラスと静的クラスには非常に大きな違いがあります。シングルトンを静的クラスとして構築すると、アプリケーション内のすべてのコンシューマに実装がハードコードされます。これにより、ユニットテストが非常に難しくなります。

やりたいことは、シングルトンのインターフェースを定義し、消費者が使用するメソッドを公開することです。コンシューマーは、インスタンス化する実装クラスへの参照を渡されます [通常、これはアプリケーション、またはDependency Injection \ Inversion of Controlに精通している場合はコンテナーです。

消費者をインスタンス化するのはこのフレームワークであり、たった1つのインスタンスが浮いていることを保証する責任があります。静的クラスからインターフェイス参照への大きな飛躍ではありません(上記のリンクで示したように)、グローバルにアクセス可能なインスタンスの利便性を失うだけです-私は知っています、グローバル参照はひどく魅惑的ですが、ルークは彼に背を向けましたダークサイドだからできる!

一般的に、ベストプラクティスは静的な参照を避けることを提案し、インターフェイスに対するプログラミングを推奨します。これらの制約でシングルトンパターンを適用することはまだ可能です。以下のガイドラインに従ってください。作業のテストに問題はないはずです:)

これがお役に立てば幸いです!


singleton!= public static class ではなく、 singleton == single instance

他のヒント

テスト容易性の欠如は、従来のシングルトンモデル(インスタンスを返す静的クラスメソッド)の大きな欠点の1つです。私の知る限り、それはシングルトンを使用するコードを再設計して他の設計を使用するのに十分な正当性です。

単一のインスタンスが絶対に必要な場合は、johnny gが示唆するように、Dependency Injectionとインターフェイスへの書き込みが間違いなく実行されます。

次のパターンを使用しています模擬できる静的ベースのシングルトンを作成するとき。コードはJavaですが、アイデアが得られると思います。このアプローチの主な問題は、コンストラクターをパッケージで保護されるように緩和する必要があることです(これにより、真のシングルトンが無効になります)。 サイドノートとして-コードは、「静的」をモックする機能に適用されます。コードは必ずしもそれを呼び出すだけではありません

通常、フライウェイトオブジェクトまたは類似の値オブジェクトにのみシングルトンを使用します。共有オブジェクトを処理する方法としては、シングルトンよりもIoCコンテナ(上記の説明を参照)の方がおそらく良い方法です。

Smalltalk(これらのパターンの多くが発生した場所)では、trueとfalseは両方とも事実上シングルトンであったと考えてください:)

シングルトンを使用する必要がある場合(および使用する理由がありますが、可能な場合は常に回避するようにします)。 IOCコンテナを使用して管理することをお勧めします。デルファイ用のものがあるかどうかわからない。ただし、JavaではSpringを使用でき、.NETではWindsor / Castleを使用できます。 IOCコンテナーはシングルトンを保持し、テスト用にさまざまな実装を登録できます。

このスニペットを超えてここに入るには、おそらく主題が大きすぎます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top