一、抽象类
public abstract class Coffee {
public abstract String getName();
public void addSugar(){
System.out.println("addSugar");
}
public void addMilk(){
System.out.println("addMilk");
}
}
二、实体类
public class AmericanCoffee extends Coffee {
@Override
public String getName() {
return "美式咖啡";
}
}
public class LatteCoffee extends Coffee {
@Override
public String getName() {
return "拉铁咖啡";
}
}
三、配置类
在resources下新建文件 bean.properties
american = com.ikaros.factory.config_factory.AmericanCoffee
latte = com.ikaros.factory.config_factory.LatteCoffee
四、工厂类
public class CoffeeFactory {
private static HashMap<String,Coffee> map = new HashMap<>();
static {
Properties p =new Properties();
//通过反射得到is
InputStream is = CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties");
try {
p.load(is);
Set<Object> keys = p.keySet();
//className为配置文件等于号前的
for (Object key : keys) {
String className = p.getProperty((String) key);
//通过className加载具体的实体类
Class clazz = Class.forName(className);
Coffee coffee = (Coffee) clazz.newInstance();
map.put((String) key,coffee);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static Coffee createCoffee(String name){
return map.get(name);
}
}
五、使用案例
public class Client {
public static void main(String[] args) {
Coffee american = CoffeeFactory.createCoffee("american");
Coffee american1 = CoffeeFactory.createCoffee("american");
//因为是用了静态代码块,随着类的加载而执行,而且只执行一次,所以是单例的,结果为true
if (american == american1){
System.out.println("true");
}
}
}