2009-05-13 3 views
6

general caseにこれに関する良い議論があります。Java Patternクラスがコンストラクタではなくファクトリメソッドを使用するのはなぜですか?

しかし、具体的にはクラスがコンストラクタではなくオブジェクトを作成するためにstaticメソッドを使用するのはなぜですか?

コンストラクタを使用する方が直感的です。

+0

詳細については、[Dr. (* 1):Javaオブジェクトの作成と破棄 - 項目1:コンストラクタではなく静的なファクトリメソッドを考慮する*] [Joshua Bloch](https://en.wikipedia.org/wiki/Joshua_Bloch) (https://www.informit.com/articles/article.aspx?p=1216151) –

答えて

9

パターンクラスは、JDKの多くのものよりも新しいものです。そのように私は、公的なコンストラクターの古いアプローチではなく、ファクトリーメソッドを使用するより現代的なアプローチを採用したと信じています。ファクトリメソッドを既存のクラスに実際に追加することはできません。

一般的に言えば、コンストラクタをファクトリメソッドよりも使用する理由はあまりありません。そのため、そこにはすべてがあると思います。ファクトリメソッドを使用すると、オブジェクトの作成を抽象化することができます。これはかなり便利です。

6

なぜあなたは2つのPattern同じ正規表現のインスタンスですか?静的な作成メソッドは、同じ正規表現が複数回尋ねられた場合でも、同じオブジェクトを時々Patternが返すように実装する可能性があります。 Patternのコンパイルは高価になる可能性があります。また、追加のcompileメソッドが必要になった場合(異なる構文など)、あまり混乱しないオーバーロードされたコンストラクタのセットではなく、異なる名前を付けることができます。

+0

一般的にあなたの議論は正しいです。しかし、このような最適化はオプションにしておくべきだと私は思う。それにもかかわらず、この最適化が適用された可能性がある他の多くのスポットがあります。 – ordnungswidrig

2

Patternのファクトリメソッドを使用すると、最終的にサードパーティのプラグイン正規表現の実装を使用することもできます。残念ながら、Sunはファクトリメソッド(プラグイン機能、キャッシュ)を使用するときに得られる機能を実装していません。

5

staticファクトリパターンは、コンストラクタに影響する可能性のある方法で基本的な実装が変更される可能性が高い場合に使用されます。要するに、工場側では、ライブラリサイドのメンテナンスにバイナリとソースの互換性がなくても、ライブラリメンテナの柔軟性が大幅に向上します。

詳しくはhttp://en.wikipedia.org/wiki/Factory_method_patternを参照してください。特に、「その他のメリットとバリエーション」を参照してください。