// java.lang.InstantiationException: com.example.demo.dp.A3FactoryMethod$ConcreteFactory2
// at java.lang.Class.newInstance(Class.java:427)
// at com.example.demo.dp.A3FactoryMethodTest.main(A3FactoryMethodTest.java:21)
// Caused by: java.lang.NoSuchMethodException: com.example.demo.dp.A3FactoryMethod$ConcreteFactory2.<init>()
// at java.lang.Class.getConstructor0(Class.java:3082)
// at java.lang.Class.newInstance(Class.java:412)
// ... 1 more
工廠類
package com.example.demo.dp;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
/**
* @program: 3.工廠方法(Factory Method [ˈfæktri; ˈfæktəri] [ˈmeθəd])模式:定義一個用於創建產品的接口,由子類決定生產什麼產品。
* @description:
* @author: [email protected]
* @create: 2020-05-07 13:42
**/
public class A3FactoryMethod {
//抽象產品:提供了產品的接口
interface Product
{
public void show();
}
//具體產品1:實現抽象產品中的抽象方法
class ConcreteProduct1 implements Product
{
public void show()
{
System.out.println("具體產品1顯示...");
}
}
//具體產品2:實現抽象產品中的抽象方法
class ConcreteProduct2 implements Product
{
public void show()
{
System.out.println("具體產品2顯示...");
}
}
//抽象工廠:提供了廠品的生成方法
interface AbstractFactory
{
public Product newProduct();
}
//具體工廠1:實現了廠品的生成方法
class ConcreteFactory1 implements AbstractFactory
{
public Product newProduct()
{
System.out.println("具體工廠1生成-->具體產品1...");
return new ConcreteProduct1();
}
}
//具體工廠2:實現了廠品的生成方法
class ConcreteFactory2 implements AbstractFactory
{
public Product newProduct()
{
System.out.println("具體工廠2生成-->具體產品2...");
return new ConcreteProduct2();
}
}
}
測試類
package com.example.demo.dp;
//import com.example.demo.dp.A3FactoryMethod.ConcreteFactory1;
import com.example.demo.dp.A3FactoryMethod.*;
import java.lang.annotation.Native;
import java.lang.reflect.Constructor;
import java.net.URLClassLoader;
public class A3FactoryMethodTest {
// 對於正常類的 Class.forName(package.ClassName)
// 對於正常類的 Class.forName(package.外部類名$內部類名)
public static void main(String[] args) {
try {
A3FactoryMethod demo = new A3FactoryMethod();
Product a;
AbstractFactory af;
String findName = "ConcreteFactory2";
// 這裏是內部類 的 創建方式
Class c = A3FactoryMethod.class.forName("com.example.demo.dp.A3FactoryMethod$" + findName);
Constructor<?> con =c.getDeclaredConstructor(A3FactoryMethod.class);
con.setAccessible(true);
Object obj = con.newInstance(demo);
af = (A3FactoryMethod.AbstractFactory) obj;
a = af.newProduct();
a.show();
} catch (Exception e) {
e.printStackTrace();
}
}
}