通过配置文件来确定具体生成哪个实例
1,接口:
package com.it.design;
public interface Sender {
void send(String str);
}
2,实现类:
package com.it.design;
public class EmailSender implements Sender {
@Override
public void send(String str) {
System.out.println("发送一份邮件。内容:"+str);
}
}
package com.it.design;
public class SmsSender implements Sender {
@Override
public void send(String str) {
System.out.println("发送一条短信。内容:"+str);
}
}
3,工厂类:
package com.it.design;
import java.io.FileInputStream;
import java.util.Properties;
public class SenderFactory {
public static Sender getSender(){
String className = getClassName();
Sender sender = null;
try {
// 通过反射,获取类名对应的字节码对象
Class clazz = Class.forName(className);
// 通过类的字节码生成类的对象
sender = (Sender) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return sender;
}
/**
* 获取配置文件中的类名
*/
private static String getClassName() {
String className = null;
try {
Properties prop = new Properties();
FileInputStream fis = new FileInputStream("config.properties");
prop.load(fis);
className = prop.getProperty("className");
return className;
} catch (Exception e) {
e.printStackTrace();
}
return className;
}
}
4,配置文件:
5,运行:
package com.it.design;
public class MainDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Sender sender = SenderFactory.getSender();
sender.send("你好");
}
}