NAMEという静的なStringクラス属性に基づいて、実行時にオブジェクトを作成する方法を簡単に拡張する方法を見つけようとしています。汎用ファクトリメソッドを1つ使用してインスタンスを作成する
単純なif構文を使用するこのコードをどのように改善できますか?
public class FlowerFactory {
private final Garden g;
public FlowerFactory(Garden g) {
this.g = g;
}
public Flower createFlower(final String name) {
Flower result = null;
if (Rose.NAME.equals(name)) {
result = new Rose(g);
} else if (Oleander.NAME.equals(name)) {
result = new Oleander(g);
} else if ... { ... } ...
return result;
}
newInstance()は、コンストラクタ引数を削除しない限り、これらのクラスで使用できません。サポートされているすべての花クラス参照のマップ(マップ)を作成し、コンストラクタ引数をプロパティ設定メソッドに移動するか、その他の簡単な解決方法はありますか?
背景情報:私の目標は、FlowerFactory.getInstance().register(this.NAME, this.class)
によって、新しいFlowerクラスの何らかの「自己登録」を実装することです。これは、これまでの非常に良い回答から、イントロスペクションベースのソリューションが最も適していることを意味します。
なぜあなたはそれを提案しますか? – sfussenegger
@sfussenegger:メソッドを静的にしたい場合はトレードオフです – dimitrisli
が間違った答えか間違った質問のどちらかです) – sfussenegger