2

シングルトンファクトリメソッドと静的ファクトリメソッドの両方で1つのインスタンスしか作成できないのはなぜですか?同じ目的のために2つの概念があるのはなぜですか?シングルトンと静的ファクトリメソッドの違い

注:ここで、「staticファクトリメソッド」は、彼が書いたジョシュアブロッホによって効果的なJavaの本から取られる:

「staticファクトリメソッドの第2の利点は、コンストラクタとは異なり、それらが必要とされていない、ということですこれにより、不変クラス(Item 15)は事前構築されたインスタンスを使用したり、構築されたインスタンスをキャッシュしたり、不要な重複オブジェクトの作成を避けるために繰り返し配布したりすることができます。Boolean.valueOf(この手法は、Flyweightパターン[Gamma95、p。195]に似ています。同等のオブジェクトが頻繁に要求される場合、特に作成コストが高ければパフォーマンスを大幅に向上させることができます。 繰り返しの呼び出しから同じオブジェクトを返す静的ファクトリメソッドの機能により、クラスはいつでも存在するインスタンスを厳密に制御できます。これを行うクラスはインスタンス制御されていると言われています。インスタンス制御クラスを作成する理由はいくつかあります。 インスタンスコントロールクラスは、それがシングルトン(項目3)またはnoninstantiable(項目4)」は

+2

シングルトンでは1つのインスタンスしか存在しないことが保証されています。スタティックファクトリメソッドは、コンストラクタを使用する代わりに使用されます。通常、オブジェクトは複雑に作成されますが、 –

+1

スタティックファクトリメソッドは、オブジェクトの作成をカプセル化しますが、複数のオブジェクトを作成することはできます。 – Pratyay

+0

答えはありません、ファクトリメソッドはコンストラクタのリストの代わりです。同じ引数をファクトリメソッドに渡すと、毎回別のオブジェクトが返されます。 – 11thdimension

答えて

1

静的ファクトリメソッドは、新しいインスタンスの別のサブクラスを返すことができる、構造の手段であることを保証することができクリティカルなロギングやレジストリのラップ、オブジェクトへのアイテムの作成、または単一の静的インスタンスの返却(多分)戻ることができます。

+0

あなたの返事をありがとう、そして今まで私はそれが静的なファクトリメソッドはシングルトンとは違って "新しいインスタンスを返す"かもしれないと思っています。しかし、あなたが精巧に説明してくれれば、それはさらに私を助けてくれるだろう。この場合、静的ファクトリメソッドは新しいオブジェクトを返すことがありますが、そうでない場合は? (効果的なJavaを読むことによって、それは単なるオブジェクトを作成するように見えます。私の質問ではEffective Javaのパラを、コンセプトは不明瞭なシナリオは賢明です) –

+0

デザインに意味があるときはいつでも。おそらく、あなたは別のスレッドで応答を共有したくないでしょう。メモリではなくハードウェアで何かを表すオブジェクトを返すことができます。ロギングはそれ自身のために話しますが、静的なクラスフィールドを直接参照するときにはログインできません。 –

0

ポイントは「th」です。新しいオブジェクトを作成する必要はありません。 "はそれです(newとは異なり、は常にが新しいオブジェクトを作成します)。ファクトリメソッドは、既存のオブジェクトを再利用するいくつかのより巧妙な方法で実装できます。

グアバのImmutableListの工場メソッドであるof()を見てください。このメソッドは空の不変リストを返します。 of()が呼び出されるたびに新しいオブジェクトを作成するポイントはありません。代わりに、常に同じオブジェクトが返されます。空のImmutableListインスタンスは、他の空のインスタンスと機能的に区別できないため、これは安全です。

関連する問題