zoukankan      html  css  js  c++  java
  • 工厂模式中存在的问题

    书接程序的耦合和解耦,这篇博客一定要结合上文程序的耦合和解耦

    工厂模式存在的问题

    当我在Client类中写上一个这样一个循环

    package com.itheima.ui;
    
    import com.itheima.factory.BeanFactory;
    import com.itheima.service.iAccountService;
    
    /**
     * @Author:Zzq
     * @Description:模拟一个表现层,用于调用业务
     * @Date:2020/6/13
     * @Time:22:28
     */
    public class Client {
        public static void main(String[] args) {
            for (int i = 0; i < 5; i++) {
                iAccountService as = (iAccountService) BeanFactory.getBean("accountService");
                System.out.println(as);
            }
        }
    }
    

    运行结果为

    可以看到,此时创建了五个对象,是多例的

    这是因为我在Bean工厂里的getBean方法中使用了newInstance()方法,该方法每次都会调用默认构造函数创建对象。

    /**
    *@Author:Zzq
    *@Description:根据bean的名称获取bean对象
    *@Date:2020/6/13
    *@Param: * @param null
    */
        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;
        }
    

    那么该如何将多例变为单例呢?思路大概就是在创建对象的时候只用一次newInstance()方法,并且将创建了的对象,用容器及时保存起来,避免长时间不用的对象被垃圾回收。

    将BeanFactory.java中代码改写如下

    package com.itheima.factory;
    
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    /**
     * @Author:Zzq
     * @Description:是一个创建bean对象的工厂
     *
     * Bean:在计算机英语中,有可重用组件的含义。
     * JavaBean:用Java编写的可重用组件。
     *      Java >> 实体类
     *      它就是创建我们的service和mapper对象的。
     *      1.需要一个配置文件来配置我们的service和mapper
     *          配置的内容:唯一标识 = 全限定类名(key = value)
     *      2.通过读取配置文件的配置内容,反射创建对象
     *
     *     配置文件可以是xml也可以是properties
     * @Date:2020/6/13
     * @Time:22:36
     */
    public class BeanFactory {
        //定义一个properties对象
        private  static Properties props;
    
        //定义一个map,用于存放要创建的对象,称之为容器
        private static Map<String , Object> beans;
    
        //使用静态代码块为Properties对象赋值
        static {
            try {
            //实例化对象
            props = new Properties();
            //获取properties文件的流对象
            InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            props.load(in);
            //实例化容器
                beans = new HashMap<String, Object>();
                //取出配置文件中的所有key
                Enumeration keys = props.keys();
                //遍历枚举
                while (keys.hasMoreElements()){
                    //取出每一个key
                    String key = keys.nextElement().toString();
                    //根据key获取value
                    String beanPath = props.getProperty(key);
                    //反射创建对象
                    Object value = Class.forName(beanPath).newInstance();
                    //把key和value存入容器
                    beans.put(key , value);
                }
            }catch (Exception e) {
                throw new ExceptionInInitializerError("初始化properties失败");
            }
        }
    
    /**
    *@Author:Zzq
    *@Description:根据bean的名称获取bean对象
    *@Date:2020/6/13
    *@Param: * @param null
    */
    
        public static Object getBean(String beanName){
            return beans.get(beanName);
        }
    
    }
    
    

    运行结果

    可以看到此时创建的对象都是同一个了

  • 相关阅读:
    js冒泡排序
    总结常见疑问
    第八课 课程重点(js语句:条件、循环)
    第九课 课程重点(js语句:获取时间、数字取值、定时器)
    利用NABCD模型进行竞争性需求分析
    运行结果及总结~张萍萍
    测试与调试 滕娟
    面向对象分析设计
    设计类图 201303014029 于海飞
    SRS文档 王倩倩 201303014004
  • 原文地址:https://www.cnblogs.com/zzzqi/p/13129730.html
Copyright © 2011-2022 走看看