静态工厂方法example

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值