适用于:
- 创建实例时有多种情况,但不能预见是哪种
- 不依赖于实例的具体实现
好处:
面向接口编程,更好的封装性
直接上代码了:
public interface Api {
public void operation();
}
public class ImplA implements Api {
@Override
public void operation() {
System.out.println("ImplA的操作");
}
}
public class ImplB implements Api {
private String str;
public ImplB(String str) {
super();
this.str = str;
}
@Override
public void operation() {
System.out.println("ImplB的操作,它的类变量为"+str);
}
}
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.util.Properties;
public class Factory {
public static Api createApi(String className) {
Properties p = getProperties();
Api api = null;
try {
api = (Api) Class.forName(p.getProperty(className)).newInstance();
} catch (Exception e) {
System.out.println("创建"+className+"失败");
}
return api;
}
public static Api createApi(String className, String parameter) {
Properties p = getProperties();
Api api = null;
try {
Constructor<?> c = Class.forName(p.getProperty(className)).getConstructor(String.class);
api = (Api) c.newInstance(parameter);
} catch (Exception e) {
System.out.println("创建"+className+"失败");
}
return api;
}
private static Properties getProperties() {
InputStream inputStream = Factory.class.getResourceAsStream(
"factory.properties");
Properties p = new Properties();
try {
p.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
inputStream = null;
} catch (IOException e) {
}
}
}
return p;
}
}
public class Test {
public static void main(String[] args) {
Api a = Factory.createApi("ImplA");
Api b = Factory.createApi("ImplB","参数");
a.operation();
b.operation();
}
}
配置文件”factory.properties”,内容如下:
ImplA=com.hefan.java.shixiao.factory2.ImplA
ImplB=com.hefan.java.shixiao.factory2.ImplB
输出:
ImplA的操作
ImplB的操作,它的类变量为参数