1.三要素:一个接口,若干个实现类,一个包含了静态方法的工厂类。
2.demo:
Car接口
package com.design.simpleFactory;
public interface Car {
String getName();
void drive();
}
实现类BMWCar
package com.design.simpleFactory;
public class BMWCar implements Car {
private final String name = "BMWCar";
public String getName() {
return name;
}
public void drive() {
System.out.println("drive " + name);
}
}
实现类BenzCar
package com.design.simpleFactory;
public class BenzCar implements Car {
private final String name = "BenzCar";
public String getName() {
return name;
}
public void drive() {
System.out.println("drive " + name);
}
}
工厂类CarFactory2
package com.design.simpleFactory;
import org.apache.commons.configuration2.XMLConfiguration;
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Parameters;
import org.apache.commons.configuration2.ex.ConfigurationException;
public class CarFactory2 {
public static Car newCar() {
Car car = null;
String name = null;
String filePath = "car.xml";
Parameters params = new Parameters();
FileBasedConfigurationBuilder<XMLConfiguration> builder = new FileBasedConfigurationBuilder<XMLConfiguration>
(XMLConfiguration.class).configure(params.xml().setFileName(filePath));
try {
XMLConfiguration config = builder.getConfiguration();
name = config.getString("factory2.name");
} catch (ConfigurationException ex) {
System.out.println("parsing xml configuration file failed");
}
try {
System.out.println(name);
car = (Car)Class.forName("com.design.simpleFactory." + name).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
System.out.println("instantiate car failed");
}
return car;
}
}
调用类Driver2
package com.design.simpleFactory;
public class Driver2 {
public static void main(String[] args) {
Car car = CarFactory2.newCar();
car.drive();
}
}
执行时遇到了java.lang.NullPointerException :instantiate car failed错误,几经实验才发现:
Class.forName()的参数需要完整的包名。
本文参考了此文:https://www.cnblogs.com/jasongj/p/5500180.html