私はかなり長い間 Java を使用してきましたが、何がfactories
そんなに特別なのかを知りませんでした。誰か説明してくれませんか?自分で実装したい理由はありますかfactory
(可能であれば)。
6 に答える
ファクトリ パターンは、クラスを分離するのに最適です。たとえば、共通のインターフェイス とAnimal
、それを実装するいくつかのクラスがあるとします。Dog
、Cat
。
ユーザーが実行時に生成したいものがわからない場合は、Dog
ポインターを作成できません。それは単にうまくいきません!
ただし、できることは、それを別のクラスに移植し、実行時に識別子をファクトリ クラスに渡すことです。その後、クラスはオブジェクトを返します。例えば:
public Animal getInstance(String discriminator)
{
if(discriminator.equals("Dog")) {
return new Dog();
}
// etc.
}
そして、呼び出しクラスは単に使用します:
String type = "Dog";
Animal value = Factory.getInstance(type);
これにより、コードが非常に読みやすくなり、値に対して実行されるロジックから決定ロジックが分離され、いくつかの共通インターフェイスを介してクラスが分離されます。全体として、かなり良いパターンです!
IMO Factory クラスの最大の利点は、構成とデータのカプセル化です。API 設計は、おそらく、そのようなクラスが非常に便利になる最も一般的なシナリオです。
開発者に直接アクセスする代わりに Factory クラスを提供することで、たとえば誰かが私の API の内部を台無しにするのを簡単に防ぐことができます。また、Factory クラスを通じて、インフラストラクチャについてどの程度知っているかを制御します。内部でサービスを提供する方法についてすべてを説明したくない場合は、代わりに Factory クラスを提供します。
信頼性と設計の一貫性を確保するために、最も重要な内部構造は Factory クラスに含める必要があります。
これらは、ランダムにやってきた開発者が次のことをしないようにするための方法です。
- 内部構造を壊す
- 不要な特権を取得する
- ブレイク構成フォーマット
ファクトリは、SPI (サービス プロバイダー インターフェイス) の概念をサポートするために JDK で広く使用されています。これは、サード パーティによって実装または拡張されることを意図した API です。たとえば、DocumentBuilderFactory.newInstance() は複雑な 4 ステップの検索アルゴリズムを使用して、実際の実装を見つけます。
ライブラリではなくアプリケーションを開発するプログラマーは、ソフトウェア設計において「シンプル イズ ベスト」のアプローチを好むべきだと思います。
これらをプライベート コンストラクターと組み合わせて使用し、シングルトンを作成します。これにより、Bean (おそらくサービス) が非シングルトンとして作成されないことが保証されます。
コンストラクターを非公開にすることで、コンストラクターを使用したクラスの作成を禁止することもできます。これにより、ファクトリ メソッドにロジックを追加でき、誰もそれをバイパスできなくなります。
編集:私は、すべての Bean のコンストラクターをパラメーターを使用して「作成」する方法で置き換える人を知っていますが (Bean の人口ロジックを集中化するために)、私はこのアプローチの大ファンではありません。