博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《研磨设计模式》——可配置的简单工厂
阅读量:5225 次
发布时间:2019-06-14

本文共 2947 字,大约阅读时间需要 9 分钟。

 

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

 

执行结果:

转载于:https://www.cnblogs.com/xingele0917/p/4917833.html

你可能感兴趣的文章
cookies相关概念
查看>>
CAN总线波形中ACK位电平为什么会偏高?
查看>>
MyBatis课程2
查看>>
桥接模式-Bridge(Java实现)
查看>>
svn客户端清空账号信息的两种方法
查看>>
springboot添加servlet的两种方法
查看>>
java的Array和List相互转换
查看>>
layui父页面执行子页面方法
查看>>
如何破解域管理员密码
查看>>
Windows Server 2008 R2忘记管理员密码后的解决方法
查看>>
IE11兼容IE8的设置
查看>>
windows server 2008 R2 怎么集成USB3.0驱动
查看>>
Foxmail:导入联系人
查看>>
vue:axios二次封装,接口统一存放
查看>>
vue中router与route的区别
查看>>
js 时间对象方法
查看>>
网络请求返回HTTP状态码(404,400,500)
查看>>
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>
Mac下使用crontab来实现定时任务
查看>>
303. Range Sum Query - Immutable
查看>>