获取对象的一步步演变-工厂模式

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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值