私は本当にこの質問の正しい名前を知る方法がわかりません。私は、使用されるたびに処分されるべき物体がある特定のシナリオを持っています。その理由は2つあります:私は、すべてのメンバ変数(フィールド)が任意の新しい使用前に初期化されることを保証しなければならないオブジェクトの複数のインスタンスを保証する
- 。
- スレッドセーフではないので、このオブジェクトが同時に呼び出される方法は2つありません。
両方の理由は、すべてのパブリックメソッドが同じミューテックスをロックし、また、すべての公共の方法で呼び出されるプライベートメソッド、上のすべての変数を初期化した、オブジェクトでカバーすることができます。
このソリューションはエラーが発生しやすく、使用前にオブジェクトをロックするため、マルチスレッドのシナリオでアクセスをシリアル化するという副作用があります。もちろん、コール・サイトは、メソッドを呼び出す前に(副作用を除去して)新しいインスタンスを作成できますが、エラーが発生しやすくなります。
だから、私はきれいで、非常に奇妙な両方見つける解決策を考え出した:
私のオブジェクトが両方に必要な変数をパラメータとして持つ静的メソッドは、オブジェクトの新しいインスタンスを作成し、メソッドを実行公開。この静的メソッドは、オブジェクトのインスタンスを作成し、必要なメソッドを呼び出します。
もちろん、コンストラクタはプライベートです。
このソリューションを見るときに気づいた最初のことは、新しいメソッド呼び出しのたびに新しいオブジェクトが必要になるため、私のオブジェクトは手続き的なメソッドのように見えることです。しかし、オブジェクトの責任はこの計画にうまく収まります。
私の質問は、(ついに!、私が知っている)、次のとおりです。
- (常にオブジェクトの新しいインスタンスを使用して)私の要件に準拠しますパターンはありますか?
- 私のアプローチを記述するパターンはありますか?それとも反パターンですか?
- オブジェクトが手続き型関数のコレクションのように見えるという事実の他に、このアプローチをしていない他の理由がありますか?
ありがとうございました。
はあなたがターゲットとしている特定の言語があり、またはこれを勧誘するためにあなたがつもりですより一般的なアドバイス? –
新しいクラスを作成し、おそらく状態を保持せずに、新しいクラスのすべての静的メソッドを非静的メソッドに置き換えます。いいえ、それが助けてもいいけど、それはテストの方がいいし、奇妙ではないように見えます。 – maaartinus
@Cody:今、私はC#で作業していますが、答えがより一般的であれば良いと思います。 –