工厂模式(Factory Pattern)和java反射机制优化思考
来源:互联网 发布:java输出三角形 编辑:程序博客网 时间:2024/05/18 00:53
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">GOF的工厂模式是最基础的一种创建型设计模式,其适用于创建同一接口的不同实现子类,</span>
其优点是:将使使用者更加方便使用,而不关心具体的创建逻辑
缺点是:每增加一个接口的子类,必须修改工程类的相关逻辑(后面我们用java的反射机制进行优化)
从上面UML图看到,我们设置了一个Shape接口,并且实现了三个子类,我们通过ShapeFactory来根据不同的名称返回不同的子类实例,通过FactoryPatternDemo进行的测试。逻辑很简单,不再详述。
public class ShapeFactory { //使用 getShape 方法获取形状类型的对象 public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; }}
基于以上面ShapeFactory的实现,我们思考到,如果我们再增加一个子类实现,那么ShapeFactory必须进行相应的修改源码,并重新进行编译,这不是我们想要的结果。如果能不改变ShapeFactory的内容,而是将需要调用的子类写在配置文件中多好,这样ShapeFactory从配置文件中接收到需要返回的子类名称,返回相应的子类实例。说到这里,大家也许有点耳熟,这和spring中的依赖注入不很相似吗,能想到这里说明你很厉害了。不错,这个就需要java的反射机制来实现(spring依赖注入的内部原理就是依赖java的反射机制),java.lang.Class类闪亮登场。
利于java.lang.Class类,我们可以通过Class.forName方法用类的详细名称(含包名)得到一个这个类的Class,之后就可以通过这个Class类进行一系列的操作了,实例化一个这个类的类对象newInstance()(调用不含参数的构造函数实例化),查看他的构造方法Constructor,方法Method,成员变量Field,执行Method(可能需要java.lang.reflect中的类)。
回到上面,我们如何优化上面的工厂模式,思路是这样的,首先将将要调用的子类名放到配置文件中(好处是在改变调用的时候并不需要改变其他的代码),然后在Factory中用Class解析这个类,并实例化返回。最后在Demo中进行调用。思路很简单
properties文件如下:
shape.className=factoryPattern.RectangleFactory代码如下
public class ShapeFactory {public Shape getShape(String shapeClassName){Shape targetShape=null;Class oneClass=null;try {oneClass=Class.forName(shapeClassName);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("不能正确获取类");}try {targetShape=(Shape) oneClass.newInstance();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("不能正确创建实例");}return targetShape;}调用:
public static void main(String[] args) {String targetClassName=ClassNameConfig.getProperty("shape.className");System.out.println("targetClassName:"+targetClassName);ShapeFactory shapeFactory=new ShapeFactory();Shape targetShape=shapeFactory.getShape(targetClassName);targetShape.draw();}这样,当修改调用子类时,只需要修改配置文件即可。当然,对于简单的工厂模式应用没必要如此繁琐
理解了这个,也就不难理解Spring的Ioc技术,Spring的配置文件换成了xml文件,而且设计比较复杂,调用程序变成了所谓的spring容器,当然这只是spring设计的基石,上层建筑还是很复杂的。
- 工厂模式(Factory Pattern)和java反射机制优化思考
- Java Factory Pattern(工厂模式)
- 工厂模式(Factory Pattern)
- 工厂模式(Factory Pattern)
- Factory Pattern(工厂模式)
- 工厂模式(Factory Pattern)
- 工厂模式(Factory Pattern)
- 【JAVA设计模式】简单工厂模式(Simple Factory Pattern)
- Java设计模式——工厂模式(Factory Pattern)
- Java设计模式:简单工厂模式(Simple Factory Pattern)
- Java设计模式:工厂方法模式(Factory Method Pattern)
- Java设计模式——工厂模式(Factory Pattern)
- Java设计模式之工厂模式(Factory Pattern)
- factory pattern 工厂模式
- Factory Pattern 工厂模式
- 工厂模式 Factory Pattern
- Factory Pattern工厂模式
- 工厂模式-Factory Pattern
- Android clipchilder属性分析
- PAT简易连连看
- c++实现数组栈和链式栈
- Linux文件和目录操作命令大全
- AndroidFlux一览
- 工厂模式(Factory Pattern)和java反射机制优化思考
- CentOS 7.1编译安装PHP7
- C++ STL 基础及应用(2) 模板与操作符重载
- HDU 2639 Bone Collector II
- pgloader
- 2015ACM长春赛区网络赛 A题 没写完
- 深度学习_caffe (4) 基于mnist实例搭建新的神经网络&在caffe中添加层
- µWebSockets:一种WebSocket服务器实现
- listview的下拉刷新和上滑加载。