您的位置:首页 > 编程语言 > Java开发

javaweb项目中利用反射实现工厂模式

2017-01-17 15:13 381 查看
javaweb项目中利用反射实现工厂模式

此处只是随笔,想到了就写下的,小学生和大家分享一下利用反射实现工厂模式。希望大家指出不足、帮助我进步,谢谢

------------------------------------------正文如下------------------------------------------

1、定义一个枚举类FactoryType,主要是用来存放需要调用的方法实现类的:包名+类型

public enum FactoryType {

ManTest("ManTest", "com.xzhang.service.factory.ManTest"),
DogTest("DogTest", "com.xzhang.service.factory.DogTest");

private String code;
private String desc;

private FactoryType(String code, String desc) {
this.code = code;
this.desc = desc;
}

public String getCode() {
return this.code;
}

public String getDesc() {
return this.desc;
}

public static String getDescByCode(String code) {
FactoryType[] values = FactoryType.values();
for (FactoryType status : values) {
if (status.getCode().equals(code)) {
return status.getDesc();
}
}
return null;
}

}2、定义一个反射工厂Factory,主要是根据classname来反射出Object对象
public class Factory {

/**
* 根据包类的全路径获取到对应的实现类
* 创建人:zx
* 2016年11月4日 下午3:00:13
* @param className
* @return
* @throws Exception
*/
public Object getValiadator(String className) throws Exception{
Class<?> cls = Class.forName(className);
Object obj = cls.newInstance();
return obj;
}

}3、定义一个内部接口GodFactory,主要是为提供给暴露出的外部接口调用
public interface GodFactory {

/**
* 对外暴露的接口
* 创建人:zx
* 2016年11月4日 下午2:55:09
* @param u
* @param orderBizType
* @throws Exception
*/
public void getUserTest(User u,FactoryType factoryType) throws Exception;

}4、定义一个“人”类ManTest实现GodFactory接口(注:此处的userService就是获取一个bean,大家可以根据需要获取对应的bean)
public class ManTest implements GodFactory {

private IUserService userService = SpringContextUtil.getBean("userService");

@Override
public void getUserTest(User u, FactoryType factoryType) throws Exception {
if(null == userService){
System.out.println(userService);
}
System.out.println("ManTest打印:"+JSON.toJSONStringWithDateFormat(u,"yyyy-MM-dd HH:mm:ss"));

}

}5、定义一个“狗”类DogTest实现GodFactory接口
public class DogTest implements GodFactory {

private IUserService userService = SpringContextUtil.getBean("userService");

@Override
public void getUserTest(User u, FactoryType factoryType) throws Exception {
if(null == userService){
System.out.println(userService);
}
System.out.println("DogTest打印:"+JSON.toJSONStringWithDateFormat(u,"yyyy-MM-dd HH:mm:ss"));

}

}6、定义一个对外暴露的接口 IFactoryEngine
public interface IFactoryEngine {

/**
* 对外暴露的接口
* (注:factoryType其实是需要传入string,然后自己再转换的)
* 创建人:zx
* 2016年11月4日 下午2:55:09
* @param u
* @param orderBizType
* @throws Exception
*/
public void getUserTest(User u,FactoryType factoryType) throws Exception;

}7、对外暴露接口的实现类FactoryEngine,注:这个实现类里面利用factory获取到了GodFactory类,这样我们就能根据传入的值来获取到对应的实现类了
public class FactoryEngine implements IFactoryEngine {

//声明工厂类
private Factory factory = new Factory();

@Override
public void getUserTest(User u,FactoryType factoryType) throws Exception {
//factory工厂获取到对应的实现类:利用 全路径+类名 反射
GodFactory god = (GodFactory) factory.getValiadator(factoryType.getDesc());
god.getUserTest(u, factoryType);
}

}8、需要对暴露在外的接口进行声明,需要在spring-mvc.xml中定义一下bean
<bean id="ifactoryEngine" class="com.xzhang.service.factory.FactoryEngine">

</bean>9、最后在UserController中进行调用
@Autowired
private IFactoryEngine ifactoryEngine;
try {
if(null != ifactoryEngine){
ifactoryEngine.getUserTest(u, FactoryType.ManTest);
}
} catch (Exception e) {
e.printStackTrace();
}


10、说明
之所以这样做,主要是想利用反射做出工厂模式。也是因为我个人的小demo需求问题,因为demo有一个需求是需要针对不同商家调用不同的方法实现。所以如果有新的商家加入进来的时候,我们只需要在重新写一个类,去实现GodFactory接口,然后再在FactoryType枚举类中添加对应的信息即可。

有问题请留言,谢谢大家指教
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  工厂模式 反射