简单工厂模式(Factory)
来源:互联网 发布:剑三重置版优化补丁 编辑:程序博客网 时间:2024/06/05 19:52
1. 模式的定义
问题的描述:
//这种方式与面向接口编程的封装行为相悖Api api = new Impl();
现在的Client,它知道要使用Api接口,但是不知由谁实现,也不知道如何实现,该怎么办?
简单工厂的定义:
提供一个创建对象实例的功能,而无需关心其具体实现。
2. UML图
Api:定义客户端所需要的功能接口
ImplA,ImplB:具体实现Api的实例类
Factorty:工厂类,选择合适的实现类来创建对象
Client:客户端,通过Factory来获取Api接口对象
代码:
/** * 接口的定义,该接口可以通过简单工厂来创建 */public interface Api { /** * 示意,具体的功能方法的定义 * @param s 示意,需要的参数 */ public void operation(String s);}/** * 接口的具体实现对象A */public class ImplA implements Api{ public void operation(String s) { //实现功能的代码,示意一下 System.out.println("ImplA s=="+s); }}/** * 接口的具体实现对象B */public class ImplB implements Api{ public void operation(String s) { //实现功能的代码,示意一下 System.out.println("ImplB s=="+s); }}/** * 工厂类,用来创造Api对象 */public class Factory { /** * 具体的创造Api对象的方法 * @param condition 示意,从外部传入的选择条件 * @return 创造好的Api对象 */ public static Api createApi(int condition){ //应该根据某些条件去选择究竟创建哪一个具体的实现对象 //这些条件可以从外部传入,也可以从其它途径获取 //如果只有一个实现,可以省略条件,因为没有选择的必要 //示意使用条件 Api api = null; if(condition == 1){ api = new ImplA(); }else if(condition == 2){ api = new ImplB(); } return api; }}/** * 客户端,使用Api接口 */public class Client { public static void main(String[] args) { //通过简单工厂来获取接口对象 Api api = Factory.createApi(1); api.operation("正在使用简单工厂"); }}
3. 研磨设计模式
接口的思想:封装隔离。对被隔离体的行为的封装,隔离是指外部调用和内部实现,外部调用只能通过接口进行调用,外部调用不知道内部具体实现的,即外部调用和内部实现是被接口隔离开的。
接口是用来封装隔离具体实现的
简单工厂命名的建议:
类名称建议:”模块名称+Factory”
方法名称建议:”get+接口名称”或者”create+接口名称”
简单工厂的实质:选择实现
新增一个实现类就要修改Factory,解决方法:使用配置文件
/** * 工厂类,用来创造Api对象 */public class Factory { /** * 具体的创造Api的方法,根据配置文件的参数来创建接口 * @return 创造好的Api对象 */ public static Api createApi(){ //直接读取配置文件来获取需要创建实例的类 //至于如何读取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 { api = (Api)Class.forName(p.getProperty("ImplClass")).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return api; }}
0 0
- 简单工厂模式(Factory)
- 简单工厂模式(Factory)
- 简单工厂模式(factory)
- 简单工厂(Factory)模式
- 简单工厂模式--Factory
- 简单工厂模式(simple Factory Pattern)
- 简单工厂模式(simple factory pattern)
- 简单工厂(Simple Factory)模式
- 简单工厂(Simple Factory)模式
- 简单工厂模式(Simple Factory Pattern)
- 简单工厂模式(Simple Factory)
- 11、简单工厂(Simple Factory)模式
- 设计模式-简单工厂(Simple Factory)
- 简单工厂(simple factory)模式
- 简单工厂(Simple Factory)模式
- 简单工厂模式(Simple Factory)
- 简单工厂模式(Simple Factory Pattern)
- 简单工厂(Simple Factory)模式
- C/C++预编译指令总结
- 第七天:创建WBS
- javascript 面试题收集
- Hadoop Archives 小数据处理
- 内联函数总结
- 简单工厂模式(Factory)
- Seekbar使用
- struts2.5动态方法绑定问题
- 中山培训第三题(未解决)
- NWU CCCC选拔赛 1014阶乘问题(思维题)
- java.lang.NoClassDefFoundError: org/activiti/bpmn/model/StartEvent
- HBase学习之三: hbase filter(过滤器)和coprocessor(协处理器)统计行数的简单应用
- SyntaxError: Non-UTF-8 code starting with
- CTF 【每日一题 20160707】凯撒加密