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);
        }
    
    }
    
    

    运行结果

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

  • 相关阅读:
    UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
    UVa 1658 (拆点法 最小费用流) Admiral
    UVa 11082 (网络流建模) Matrix Decompressing
    UVa 753 (二分图最大匹配) A Plug for UNIX
    UVa 1451 (数形结合 单调栈) Average
    UVa 1471 (LIS变形) Defense Lines
    UVa 11572 (滑动窗口) Unique Snowflakes
    UVa 1606 (极角排序) Amphiphilic Carbon Molecules
    UVa 11054 Wine trading in Gergovia
    UVa 140 (枚举排列) Bandwidth
  • 原文地址:https://www.cnblogs.com/zzzqi/p/13129730.html
Copyright © 2011-2022 走看看