14

なぜ静的メソッドが存在するのか疑問に思いました。Create

たとえば、なぜこのコードを使用するのですか?

System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);

このコードについて:

System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);

どちらか一方を使用する理由がわかりません。また、この構成を使用するクラス間の関係も見つかりません。

誰かがこれに光を当てることができますか?

4

9 に答える 9

18

XmlReaderは抽象クラスです。インスタンス化することはできません。

メソッドの提供Createは、ファクトリパターンのインスタンスです。指定された引数に応じて、XmlReaderの異なる実装が選択されて返されます。たとえば、.NETFrameworkには検証用と非検証用のXmlReader実装があります。

于 2010-03-18T13:57:19.493 に答える
6

より一般的な答え...

「静的ファクトリメソッド」として知られるこの種のメソッドが好きな理由は、(コンストラクタではなく)名前を付けることができるからです。したがって、3つの異なるコンストラクターが必要な場合は、代わりに、それらの使用に関連する名前を持つ静的ファクトリメソッドを作成できます。

もう1つの理由は、ファクトリメソッドが実際に新しいオブジェクトを作成する必要がないことです。必要に応じて同じオブジェクトを何度も返すことができます。

于 2010-03-18T14:02:34.733 に答える
4

なぜなら、(dtbが答えたように)抽象クラスにアクセスしたり、抽象クラスを返したりすることができない派生型のオブジェクトを実際に作成して返すことができるからです。これはファクトリメソッドパターンです。

于 2010-03-18T13:57:39.040 に答える
4

コンストラクターは1つの特定のクラスのインスタンスを作成するためにのみ使用できますが、静的Createメソッドは入力に応じて異なるクラスのインスタンスを作成できます。

XmlReaderクラスの場合、Createメソッドは、使用するオーバーロードとそれに送信するパラメーターに応じて、、、、XmlDictionaryReaderまたはを返します。XmlTextReaderXmlValidatingReaderXmlNodeReader

于 2010-03-18T14:03:36.423 に答える
3

このパターンにより、XmlReaderクラスは、に渡したパラメーターに合わせて調整された派生クラスのインスタンスを提供できますCreate。特に、XmlReaderSettingsオブジェクトを受け入れるオーバーロードに注意してください。設定に応じて、異なるXmlReaderサブクラスを返すことができます。

より良い例はWebRequest.Create(url)です。HttpWebRequest渡すURLによっては、、FtpWebRequestなどを受け取る場合があります。

于 2010-03-18T13:59:55.870 に答える
3
  • 取得したオブジェクトの正確なクラスにコミットする必要がないためです。コンストラクターは、1つのクラスからのみオブジェクトを作成できます。
  • メソッドに意味のある名前を付けることができるためです(例:BigInt.probablePrime())。コンストラクターは、クラスと同じ名前のみを持つことができます。
  • Point.fromPolarCoords(int、int)やPoint.fromCartesianCoords(int、int)など、同じパラメータータイプの組み合わせに対して複数のファクトリメソッドを使用できますが、コンストラクターPoint(int、int)は1つしか存在できないためです。

(より詳細な回答は、Blochの「EffectiveJava」に記載されています。)

于 2010-03-18T14:01:51.630 に答える
1

自己文書化の形式として存在する場合もあります。接続文字列または構成ファイル内の接続の名前のいずれかを使用してインスタンス化できるdbアクセスコンポーネントがあります。これらのメソッドはどちらも文字列をパラメーターとして受け取るため、引数だけで区別することはできません。そこで、FromConnectionString(string)ファクトリメソッドとファクトリメソッドを作成しましたFromConnectionName(string)。このニュアンスはnew Foo(bool, string)一線で完全に失われます。

于 2010-03-18T14:02:33.207 に答える
0

オブジェクトの作成をカプセル化します

于 2010-03-19T09:23:27.127 に答える
0

このようにして、XmlReaderの実装を変更し、ユーザーコードを壊さないようにすることができます(たとえば、Createメソッドから返される実際の型を変更できます)。

XmlReaderクラス階層に逆の関係が作成されるため、私は個人的にこのアプローチが好きではありません。たぶん彼らはファクトリーパターンはやり過ぎだと思ったのでしょうか?

于 2010-03-18T14:06:37.393 に答える