ファクトリ モードは、複雑なオブジェクトを作成するのに適しています. オブジェクトの作成を完了するために new を直接使用できる場合は、ファクトリ モードを使用する必要はありません.
ファクトリ
:
package ban.com;
public abstract class Product {
abstract void method();
}
特定の製品カテゴリ A:
package ban.com;
public class ConcreteProductCup extends Product {
@Override
void method() {
System.out.println("Cup");
}
}
特定の製品カテゴリ B:
package ban.com;
public class ConcreteProductSpoon extends Product {
@Override
void method() {
System.out.println("Spoon");
}
}
抽象ファクトリ クラス:
package ban.com;
public abstract class Factory {
public abstract Product createProduct();
}
コンクリート工場クラス:
package ban.com;
public class ConcreteFactory extends Factory{
@Override
public Product createProduct(){
return new ConcreteProductSpoon();
}
}
クライアントクラス:
package ban.com;
public class Client {
public static void main(String[] args) {
Factory factory=new ConcreteFactory();
factory.createProduct().method();
}
}
印刷するデータは標準のファクトリモデルであるSpoonで、Cupオブジェクトを作成したい場合は、ファクトリ実装クラスを直接作成してCupオブジェクトを生成することができます。
package ban.com;
public class ConcreteFactory extends Factory{
@Override
public Product createProduct(){
return new ConcreteProductCup();
}
}
ファクトリ モデルは主に 4 つのモジュールに分けられます。
1. 抽象ファクトリ: ファクトリ モデルのコア
2. 抽象プロダクト: ファクトリ メソッドを作成するために使用される親クラス
3. 特定のファクトリ クラスの実現: 特定の作成ロジック
4 . 特定の製品クラスの実現 : 製品の独自のロジック
そのファクトリの実装クラスは必要に応じて作成されるようですが、コードはより簡潔ではないため、リフレクションの方法に従って特定の製品オブジェクトを簡潔に作成できます。ここではジェネリック部分を使用します。 (ジェネリック部分の将来の知識で更新されます)
抽象ファクトリを変更します。
package ban.com;
public abstract class Factory {
public abstract <T extends Product> T createProduct(Class<T> clz);
}
T は Product から継承されたジェネリック型であり、戻り値は Product のサブクラスである必要があり、渡された clz はクラス オブジェクトです
。具体的なファクトリの実装:
package ban.com;
public class ConcreteFactory extends Factory{
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product product=null;
try {
//通过反射获取对象实例
product=(Product) Class.forName(clz.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
e.printStackTrace();
}
return (T) product;//需是Product的子类
}
}
このようにして、必要なクラスの名前を直接渡すことで、対応するオブジェクトを取得できることを確認し、クライアントを変更できます。
package ban.com;
public class Client {
public static void main(String[] args) {
Factory factory=new ConcreteFactory();
factory.createProduct(ConcreteProductCup.class).method();
factory.createProduct(ConcreteProductSpoon.class).method();
}
}
出力された結果: Cup Spoon
の利点は、必要なオブジェクトをより簡潔かつ動的に生成できることです. 以前の方法は、マルチファクトリの方法になり、使用できるようになりました.