反射在工厂模式上的应用

简介:

1.前言

  之前写过一篇设计模式之简单工厂(Factory method),在这篇文章的“7.可配置的简单工厂实例”中,客户端没有传入参数,这是因为在factory中已经定义了需要读取的配置文件。但是这样有个缺点就是灵活性不够,必须明确指定需要读取配置文件中的某一项,比如上面就定义了必须读取的是配置文件中的ImplClass=edu.sjtu.erplab.yanmo.simplefactory.Impl2这一个条目,假设配置文件中有多个条目,我们想要通过客户端传入一个简单的参数ImplClass来动态调用,那么该实例是不能完成。

2.正文

2.1利用反射机制在客户端传入具体的"包.类名"动态创建实例

 首先定义一个水果接口Fruit,里面有一个eat的方法

Fruit.java

View Code

然后定义两类水果Apple和Orange继承Fruit接口

Apple.java

View Code

Orange.java

View Code

Factory.java

View Code

最后在客户端中通过传入具体的类名来动态创建水果实例

FacotryDemo1.java 

View Code

第一次传入的是Apple的类名,第二次传入的是Orange的雷鸣,所以两次运行eat方法结果是

吃苹果
吃橘子

2.2结合配置文件动态创建实例

以上操作代码虽然可以通过反射取得接口的实例,但是在操作的时候需要传入完整的包.类名称,而且用户也无法知道一个接口有多少个可以使用的子类,所以此时可以通过属性文件的形式配置所要的子类信息。

在接口类所在包下创建一个Fruit.properties文件,文件内容为:

apple=edu.sjtu.erplab.reflect.Apple
orange=edu.sjtu.erplab.reflect.Orange

在属性文件中用简单的apple和orange来表示完整的包.类名称,这样在使用时直接通过属性名称即可,不再需要一长串包.类名称

要使用属性文件,我们需要创建属性操作类,具体实现如下:

View Code

这个类用于读取该类所在的包下的配置文件Fruit.properties,并返回具体的配置文件中的内容。

然后再客户端中我们只需要通过配置文件操作类获取配置文件,并传入属性名称即可,代码实例如下

View Code

可以看到这里我们只需要往工厂方法中传入pro.getProperty("apple")即可,而pro.getProperty("apple")表示读取配置文件中key为apple所对应的value,也就是

edu.sjtu.erplab.reflect.Apple。在这里客户只需要知道apple而不需要知道edu.sjtu.erplab.reflect.Apple,实现了很好的封装。

 

本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2514958.html,如需转载请自行联系原作者


目录
相关文章
|
4天前
|
设计模式
设计模式-简单工厂和工厂方法
设计模式-简单工厂和工厂方法
|
7月前
|
设计模式 Java 数据库
JAVA设计模式2:工厂方法模式,将对象的实例化过程封装在子类
JAVA设计模式2:工厂方法模式,将对象的实例化过程封装在子类
|
4天前
|
设计模式 C#
C#反射机制实现开闭原则的简单工厂模式
C#反射机制实现开闭原则的简单工厂模式
23 0
|
9月前
反射的应用:动态代理
反射的应用:动态代理
33 0
|
9月前
|
设计模式 Java
设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)
设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)
56 0
|
设计模式 Java
设计模式(10) -- 工厂设计模式(简单工厂,工厂方法,抽象工厂模式)(下)
设计模式(10) -- 工厂设计模式(简单工厂,工厂方法,抽象工厂模式)(下)
113 0
设计模式(10) -- 工厂设计模式(简单工厂,工厂方法,抽象工厂模式)(下)
|
设计模式
设计模式(10) -- 工厂设计模式(简单工厂,工厂方法,抽象工厂模式)(上)
设计模式(10) -- 工厂设计模式(简单工厂,工厂方法,抽象工厂模式)(上)
设计模式(10) -- 工厂设计模式(简单工厂,工厂方法,抽象工厂模式)(上)
|
设计模式
设计模式 - 简单工厂(静态工厂)& 工厂方法(构建工厂)
设计模式 - 简单工厂(静态工厂)& 工厂方法(构建工厂)
79 0
设计模式 - 简单工厂(静态工厂)& 工厂方法(构建工厂)
|
设计模式 Java 开发者
反射与工厂设计模式|学习笔记
快速学习 反射与工厂设计模式
146 0
反射与工厂设计模式|学习笔记
|
设计模式 Java 开发者
反射与单例设计模式|学习笔记
快速学习反射与单例设计模式
反射与单例设计模式|学习笔记