おそらく、静的ファクトリ メソッド パターンについて話していたのでしょう (オブジェクトを動的に作成するためのリフレクション API メソッドについてではありませんでした)。
コンストラクgetInstanceOf()
ターやnew
. 静的ファクトリ メソッドは次のことができます。
特定の場合に望ましい場合は、メイン クラスの別のサブクラスを作成することを選択します (プロパティや他のオブジェクト/シングルトン、またはメソッド パラメーターなどの環境条件に基づく)。
オブジェクトを作成するのではなく、既存のオブジェクトを返すことを選択します。この例については、Java API のBoolean.valueOf(boolean)を参照してください。
コンストラクターと同じことを行います - クラス自体の新しいインスタンスを返すだけです。
新しいオブジェクトを構築し、それらのメソッドに名前を付けるためのさまざまな種類の方法を提供して、混乱を少なくします (たとえば、コンストラクターでこれを試してみると、すぐに多くの異なるオーバーロードができます)。2 つの異なる方法でインスタンスを作成できるようにする必要があるが、同じタイプのパラメーターのみが必要な場合、コンストラクターではこれが不可能な場合もあります。例:
// This class will not compile!
public class MyClass {
public MyClass(String name, int max) {
//init here
}
public MyClass(String name, int age) {
// init here
}
}
// This class will compile.
public class MyClass2 {
private MyClass2() {
}
public static MyClass2 getInstanceOfMax(String name, int max) {
MyClass2 m2 = new MyClass2();
// init here
return m2;
}
public static MyClass2 getInstanceOfAge(String name, int age) {
MyClass2 m2 = new MyClass2();
// init here
return m2;
}
}
上記の任意の組み合わせを実行します。
さらに、インスタンスのインスタンス化の詳細を他のクラスから隠しているため、将来変更することができます (構造のカプセル化)。
コンストラクターは、要求された正確な型のオブジェクトの新しいインスタンスのみを作成できます。後で変更することはできません。
このパターンのいくつかの欠点は次のとおりです。
ファクトリ メソッドは静的であるため、サブクラスで継承することはできません。親コンストラクターは、サブクラスから簡単にアクセスできます。
ファクトリ メソッドの名前は大きく異なる可能性があり、一部の (新しい) 開発者にとっては混乱を招く可能性があります。
あなたはまた、個人的な経験を求めました。はい、どちらのパターンもよく使います。ほとんどのクラス コンストラクターでは、より高度なニーズがある場合は、静的ファクトリを使用します。私は、この形式の構築が義務付けられている他の言語 (専売ですが、Java に似ています) のプロジェクトにも取り組んでいます。