例子:
在Client.java中
// IAccountService accountService=new AccountServiceImpl();
为了解耦,可以创建BeanFactory
先创建bean.properties
accountService=com.itheima.service.impl.AccountServiceImpl accountDao=com.itheima.dao.impl.AccountDaoImpl
创建factory.BeanFactory
/**
 * 需要一个配置文件来配置我们的service和dao
 * 配置的内容:唯一标识=全限定类名(key=value)
 * 通过读取配置文件中的内容,反射创建文件
 * 我们的配置可以是xml也可以是properties
 */
public class BeanFactory {
    private static Properties props;

    static {
        props=new Properties();
        try {
            InputStream in=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            props.load(in);
        }catch (Exception e) {
            throw new ExceptionInInitializerError("初始化properties失败!");
        }
    }
    public static Object getBean(String beanName) {
        Object bean=null;
        try {
            String beanPath=props.getProperty(beanName);
            bean=Class.forName(beanPath).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
}
这样我们在Client中就可以用工厂BeanFactory了
IAccountService accountService= (IAccountService) BeanFactory.getBean("accountService");
accountService.saveAccount();
但是这样的话我们利用BeanFactory创建出来的对象是多例的,
多例对象被创建多次,执行效率没有单例对象高,
虽然单例对象有线程问题,但我们的service和dao中不存在类成员变量,所有进一步分析
我们其实是没有问题的,因为我们没有在单例对象中可以改变的类成员。
我们希望是单例的。
bean=Class.forName(beanPath).newInstance();
如果创建完之后不存起来,由于Java的垃圾回收机制,长时间不用就会被回收。所以对象创建出来要存起来。



我们业务层和持久层是很少包含类成员的,所以可以是单例的。单例的对象效果更好。