• 工厂模式(容器工厂)


    实现原理:通过读取解析xml配置文件,拿到相应的类名和类的包全名,将类名存到map集合中的key值,再通过反射得到相应的实例,从而动态的生产不同的对象出来

    1.新建两个接口,Phone的接口,里面有两个方法,打电话和发消息的方法;Pad的接口,玩游戏的方法

    2.三个实现类,HuaiPhone类和VivoPhone类实现Phone接口的所有方法,PadPhone类实现Pad接口的方法

    3.xml配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans>
        <bean id="HuaiPhone" class="edu.nf.factory.easy.Impl.HuaiPhone"/>
        <bean id="PadPhone" class="edu.nf.factory.easy.Impl.PadPhone"/>
        <bean id="VivoPhone" class="edu.nf.factory.easy.Impl.VivoPhone"/>
    </beans>

    4、最重要的一步:新建一个工厂类,这个工厂可以动态的生产不同的对象

    package edu.nf.factory.vesselFactory;
    
    import edu.nf.factory.easy.Phone;
    import edu.nf.factory.utils.Reflect;
    import org.dom4j.*;
    import org.dom4j.io.SAXReader;
    
    import javax.annotation.Resources;
    import java.io.File;
    import java.io.InputStream;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    /**
     * 描述:
     * 容器工厂
     *
     * @author lance
     * @create 2018-09-28 11:29
     */
    public class VesselFac {
    
        private static Map<String,Object> map = new HashMap<String, Object>();
    
        static {
            //新建一个xml读取器
            SAXReader reader = new SAXReader();
            ClassLoader classLoader = VesselFac.class.getClassLoader();
            //得到一个xml的文件流
            InputStream is = classLoader.getResourceAsStream("beans.xml");
            try {
                //以文件流方式解析成doc文档
                Document doc = reader.read(is);
                //得到一个根节点
                Element ele = doc.getRootElement();
                //得到所有的字节点
                Iterator<Element> it = ele.elementIterator();
                //循环所有的子节点
                while (it.hasNext()){
                    Element elem = it.next();
                    String name = elem.attributeValue("id");
                    String className = elem.attributeValue("class");
                    map.put(name,className);
                }
                //根据包名反射得到实例
                for(String m : map.keySet()){
                    Object instance = Class.forName((String)map.get(m)).newInstance();
                    map.put(m,instance);
                }
            } catch (Exception e) {
                throw new RuntimeException(e.getMessage());
            }
        }
        /**
         * 获取实例的方法(根据key值来获取相应的实例)
         * @param key
         * @param clazz
         * @param <T>
         * @return
         */
        public static <T> T getObject(String key, Class<T> clazz){
            return (T)map.get(key);
        }
    
    }

    5、测试:

  • 相关阅读:
    基于Asp.Net webApi owin oauth2的实现
    动态赋值
    C#生成二维码
    深度学习中反卷积层(转置卷积)引起的棋盘格噪声
    batch normalization 批归一化 --- 一个硬币的两面
    FFMPEG常用命令-格式转换-持续更新中
    [译]CRF和QP的区别
    读懂NCHW和NHWC
    [译]GPUView
    有一次接口设计
  • 原文地址:https://www.cnblogs.com/gepuginy/p/9720465.html
Copyright © 2020-2023  润新知