1.最开始
举个简单的例子:
public class Man{
public void eat(){
System.out.println("大口吃饭");
};
}
public class Woman{
public void eat(){
System.out.println("小口吃饭");
};
}
获取对象:
Man man = new Man();
man.eat();
Woman woman = new Woman();
woman.eat();
2.抽象为接口
public interface Person{
public void eat();
}
public class Man implements Person{
@Override
public void eat(){
System.out.println("大口吃饭");
};
}
public class Woman implements Person{
@Override
public void eat(){
System.out.println("小口吃饭");
};
}
获取对象:
Person man = new Man();
man.eat();
Person woman = new Woman();
woman.eat();
3.通过工厂获取对象
public interface Person{
public void eat();
}
public class Man implements Person{
@Override
public void eat(){
System.out.println("大口吃饭");
};
}
public class Woman implements Person{
@Override
public void eat(){
System.out.println("小口吃饭");
};
}
//通过关键字获取
public class PersonFactory{
public Person getPerson(String gender){
if("M".equals(gender)){
return new Man();
}else if("F".equals(gender)){
return new Woman();
}
return null;
}
}
获取对象:
PersonFactory factory = new PersonFactory();
Person person = factory.getPerson("M");
person.eat();
4.工厂类的改进
上述工厂类中如果增加新的类,需要修改其中if else判断条件
//通过类名获取
public class PersonFactory{
public Person getPerson(String className){
try {
Person person= (Person) Class.forName(className).newInstance();
return person;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
获取对象:
PersonFactory factory = new PersonFactory();
//这里其实是类的全路径
Person person = factory.getPerson("Man");
person.eat();
也可以通过属性文件类配置一个关键字和类名的关系,通过类的关键字来获取对象
//读取属性文件的工具类
public class PropertiesReader {
public Map<String, String> getProperties() {
Properties properties = new Properties();
Map<String, String> map = new HashMap<String, String>();
try {
InputStream inputStream= getClass().getResourceAsStream("personType.properties");
properties.load(inputStream);
Enumeration<?> enumeration = properties.propertyNames();
while (enumeration.hasMoreElements()) {
String key = (String) enumeration.nextElement();
String property = properties.getProperty(key);
map.put(key, property);
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
//属性文件personType.properties
M = com.Man
F = com.Woman
public class PersonFactory{
public Person getPerson(String classKey){
try {
Map<String, String> map = new PropertiesReader().getProperties();
Person person= (Person) Class.forName(map.get(classKey)).newInstance();
return person;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
获取对象:
PersonFactory factory = new PersonFactory();
Person person = factory.getPerson("M");
person.eat();