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("哈哈,不要紧张,只是个测试而已!");
        }
    }

    执行结果:

  • 相关阅读:
    103、服务器出现大量close_wait的连接的原因是什么?有什么解决方法?
    102、常见的HTTP状态码有哪些?
    rpm包管理、yum源及创建本地仓库(同步华为源)
    文件管理之:输出与重定向echo
    高级权限--acl, mask,文件属性权限;su切换用户,sudo提权
    基本权限;权限对⽂件or⽬录的意义;特殊权限;文件权限之umask
    权限管理--用户介绍;用户与组相关文件;用户管理命令之用户创建、查看、删除、修改
    文件管理之:打包、压缩
    字符处理命令-sort排序,uniq去重,cut剪切文件,tr删除或替换结果集,wc统计
    上传与下载wget、curl、r z、s z
  • 原文地址:https://www.cnblogs.com/xingele0917/p/4917833.html
Copyright © 2011-2022 走看看