ファクトリ パターンは、依存関係を追加する手間を軽減します。ファクトリには状態が含まれる可能性があり、実際には複数の依存関係をカプセル化できるためです (たとえば、オブジェクトのコンストラクターを呼び出すために必要な 3 つの依存関係を提供する代わりに、単一のファクトリーのみを提供するようになりました)。ファクトリには、コンストラクターに提供する必要がある 3 つのオブジェクトが含まれます)。
例を挙げると、次のように比較します。
void DoIt(const DependencyA& a, const DependencyB& b) {
// NOTE: "x" is a contrived additional variable that we add here to
// justify why we didn't just pass DependencyC directly.
int x = ComputeX();
std::unique_ptr<DependencyC> dependency_c(new DependencyC(a, b, x));
dependency_c->DoStuff();
}
と:
void DoIt(const DependencyCFactory& factory) {
int x = ComputeX();
std::unique_ptr<DependencyC> dependency_c(factory->Create(x));
dependency_c->DoStuff();
}
2 番目のバージョンでは、"DoIt" メソッドへの依存関係が少なくて済むことに注意してください。これは、これらの依存関係がプログラム全体で必要ないという意味ではありません (実際、プログラムはまだファクトリの実装で DependencyA と DependencyB を使用しています)。ただし、このように構造化することで、その依存関係をファクトリ コードだけに分離することができ、他のコードをよりシンプルに保ち、依存関係を簡単に変更できますDependencyC
(現在、ファクトリ自体のみを更新する必要があり、すべての場所で更新する必要はありません)。インスタンス化するDependencyC
)、さらに特定の安全性/セキュリティ上の利点を持つことさえできます (例: ifDependencyA
およびDependencyB
データベースのパスワードや API キーなどの機密性が高い場合、それらの使用をファクトリに制限することで、データベースや API を使用する必要があるすべての場所でこれらを渡す場合と比較して、誤った取り扱いの可能性が減少します)。
Order
本に示されている例では、コンストラクターが直接使用される場所の数が減ったため、ファクトリが役立つ理由は次のとおりです。Customer
ファクトリを作成した 1 つの場所だけを変更して、ファクトリの追加フィールドとして格納する必要があります。ファクトリのその他の用途を変更する必要はありません。比較すると、ファクトリを使用しない場合は、コンストラクターを直接使用することが多く、Customer
オブジェクトへのアクセスを何らかの方法で取得するには、コンストラクターのそれぞれを更新する必要があります。