zoukankan      html  css  js  c++  java
  • 《研磨设计模式》——可配置的简单工厂

    package cn.telling.factory;
    
    /**
     * 工厂类,用来创建API对象
     * @ClassName: Api
     * TODO
     * @author xingle
     * @date 2015-10-28 下午4:27:45
     */
    public interface Api {
        public void opration(String s);
    
    }
    package cn.telling.factory;
    
    /**
     * 接口具体实现对象A
     * @ClassName: ImplA
     * TODO
     * @author xingle
     * @date 2015-10-28 下午4:30:23
     */
    public class ImplA implements Api{
    
        /**
         * 
         * @Description: TODO
         * @param s
         * @author xingle
         * @data 2015-10-28 下午4:30:32
         */
        @Override
        public void opration(String s) {
            System.out.println("ImplA s=="+s);
        }
    
    }
    package cn.telling.factory;
    
    /**
     * 接口具体实现对象B
     * @ClassName: ImplB
     * TODO
     * @author xingle
     * @date 2015-10-28 下午4:40:15
     */
    public class ImplB implements Api{
    
        /**
         * 
         * @Description: TODO
         * @param s
         * @author xingle
         * @data 2015-10-28 下午4:40:25
         */
        @Override
        public void opration(String s) {
            System.out.println("ImplB s=="+s);
        }
    
    }

    配置文件用最简单的properties文件,实际开发中多是xml配置。定义一个名称为“FactoryTest.properties”的配置文件,放置到factory同一个包下面,内容如下:

    ImplAClass=cn.telling.factory.ImplA
    ImplBClass=cn.telling.factory.ImplB

    工厂类实现如下:

    package cn.telling.factory;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    /**
     * 工厂类
     * @ClassName: Factory TODO
     * @author xingle
     * @date 2015-10-28 下午4:31:52
     */
    public class Factory {
        /**
         * 具体的创造Api的方法,根据配置文件的参数来创建接口
         * 
         * @return 创造好的Api对象
         */
        public static Api createApi(String type) {
            // 直接读取配置文件来获取需要创建实例的类
            // 至于如何读取Properties,还有如何反射这里就不解释了
            Properties p = new Properties();
            InputStream in = null;
            try {
                in = Factory.class.getResourceAsStream("FactoryTest.properties");
                p.load(in);
            } catch (IOException e) {
                System.out.println("装载工厂配置文件出错了,具体的堆栈信息如下:");
                e.printStackTrace();
            } finally {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 用反射去创建,那些例外处理等完善的工作这里就不做了
            Api api = null;
            try {
                if("A".equals(type)){
                    api = (Api) Class.forName(p.getProperty("ImplAClass")).newInstance();
                }else if("B".equals(type)){
                    api = (Api) Class.forName(p.getProperty("ImplBClass")).newInstance();
                }
                
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return api;
        }
    
    }

    客户端程序:

    package cn.telling;
    
    import cn.telling.factory.Api;
    import cn.telling.factory.Factory;
    
    /**
     * 
     * @ClassName: Client
     * TODO
     * @author xingle
     * @date 2015-10-28 下午4:36:58
     */
    public class Client {
        public static void main(String[] args) {
            Api api = Factory.createApi("B");
            api.opration("哈哈,不要紧张,只是个测试而已!");
        }
    }

    执行结果:

  • 相关阅读:
    linux上搭建私人Git服务器的详细教程
    25个经典的Spring面试问答
    面试题汇总
    idea 中添加查看字节码工具
    HTTP 及 http 请求解析过程
    常见的攻击类型及防范
    Postman 压力测试
    Postman 接口测试配置 Pre-request Script
    jq图片展示插件highslide.js
    cesium transform 倾斜摄影模型矩阵指定经纬度
  • 原文地址:https://www.cnblogs.com/xingele0917/p/4917833.html
Copyright © 2011-2022 走看看