工厂模式解耦与升级

例子:
在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的垃圾回收机制,长时间不用就会被回收。所以对象创建出来要存起来。



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

全部评论

相关推荐

黑皮白袜臭脚体育生:简历条例统一按使用了什么技术实现了什么功能解决了问题或提升了什么性能指标来写会好些,如使用布隆过滤器实现了判断短链接是否存在,大大提升了查询速度
点赞 评论 收藏
分享
2024-12-23 10:55
已编辑
大连理工大学 Java
牛客930504082号:华子综测不好好填会挂的,而且填的时候要偏向牛马选项
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务