利用Java反射机制优化简单工厂设计模式
之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信、发送邮件。当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发。就是一个程序员和另一个程序员可以同时去书写代码,而不是一个程序员等到另一个程序员写完以后再去书写代码。其中的粘合剂就是接口和配置文件。
通过简单的工厂设计模式可以达到类的 解耦合目的,但是之前的工厂设计模式依然存在问题,那就是在增加一个子类时都需要修改工厂类,这样很麻烦。现在就可以通过反射机制修改工厂类,这样肯定会 非常麻烦。学习完反射机制之后,实际上,此时就可以通过反射机制来改善工厂类,让其在增加子类时可以不用做任何的修改,就能达到功能的扩充,如下:
/**
*
*/
package com.factoryTest; import java.util.Date;
import java.util.List; /**
*
* 描述:邮件短信消息记录
* @author 小当家
* @created 2018年1月11日
*/
public class MessageDTO implements java.io.Serializable{ /**
* serialVersionUID : long.
*/
private static final long serialVersionUID = -1985834353259521222L; /**
* 消息ID
*/
private Long messageId; /**
* 需要发送短信的手机号码,多个用,隔开
*/
private String smsPhone; /**
* 需要发送短信的短信内容
*/
private String content; /**
* 邮件收件人
*/
private String mailRecipient; /**
* 邮件标题
*/
private String mailSubject; /**
* 邮件抄送人
*/
private String messageCC; /**
* 邮件附件ID
*/
private Long attachId; /**
* 消息发送时间
*/
private Date sendDate; /**
* 消息发送用于什么模块
*/
private String module; /**
* 发送状态,1:发送成功 0:发送失败
*/
private String sendStatus; /**
* 发送消息类型:00000000->不发送 、00000001->短信、00000010->邮件、00000100->系统、00000011->短信和邮件以此类推
*/
private String sendType; /**
* 发送用户
*/
private String userCode; /**
* 接收用户,多用户可用逗号隔开
*/
private String recipientCode; /**
* 备注
*/
private String note; /**
* 附件名称
*/
private String attachmentName; /**
* 附件地址
*/
private String attachPath; private List<Long> attachIds; get set ... }
定义一个发送邮件的接口
/*
*
*/
package com.factoryTest; /**
* 描述:发送信息基础类
* @author 小当家
* @created 2018年1月11日
*/
public interface SendTypeBase {
/**
*
* 描述
* @author 小当家
* @created 2018年1月11日
*/
public void sendMessage(MessageDTO dto);
}
写一个发送邮件的类实现接口
/*
*
*/
package com.factoryTest; /**
* 描述:发送邮件
* @author 小当家
* @created 2018年1月11日
*/
public class SendMail implements SendTypeBase{ @Override
public void sendMessage(MessageDTO dto) {
System.out.println(dto.getUserCode()+"发送邮件"); } }
实现一个发送短信的类实现接口
/*
*
*/
package com.factoryTest; /**
* 描述:发送短信
* @author 小当家
* @created 2018年1月11日
*/
public class SendSms implements SendTypeBase{ @Override
public void sendMessage(MessageDTO dto) {
System.out.println(dto.getUserCode()+"发送短信"); } }
注意:
对比下简单工厂,如:
/*
*
*/
package com.factoryTest; /**
* 描述
* @author 小当家
* @created 2018年1月11日 下午4:25:27
*/
public class SimpleFactory {
public SendTypeBase SendMessage(String type) {
if("sms".equals(type)) {
return new SendSms();
}else {
return new SendMail();
}
}
}
下面是通过反射实现的工厂类
/*
*
*/
package com.factoryTest; import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map; /**
* 描述:发送信息工厂类
* @author 小当家
* @created 2018年1月11日
*/
public class SendMessageFactory { private final static Map<String, String> MESSAGE_MAP = new HashMap<String, String>();
static {
//短信
MESSAGE_MAP.put("SMS", "com.factoryTest.SendSms");
//邮件
MESSAGE_MAP.put("EMAIL", "com.factoryTest.SendMail"); } @SuppressWarnings("rawtypes")
public static SendTypeBase createClass(String type) throws Exception {
if(MESSAGE_MAP.get(type) == null) {
throw new Exception("未配置发送信息类型");
}
Class classType = Class.forName(MESSAGE_MAP.get(type));
@SuppressWarnings("unchecked")
Constructor constructor = classType.getDeclaredConstructor();
return (SendTypeBase) constructor.newInstance();
}
}
这里类型其实可以通过配置文件来处理,这样增加一个子类,就不需要改工厂类了。
利用Java反射机制优化简单工厂设计模式的更多相关文章
- (转)java反射机制及简单工厂模式
第一步,定义一个接口类 package factory.face; /** * 接口,为了保证返回的对象可以统一用 Product接受 * @author Administrator */ publi ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- java反射机制的简单介绍
参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...
- 利用JAVA反射机制设计通用的DAO
利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...
- 利用Java反射机制对实体类的常用操作工具类ObjectUtil
代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...
- 利用Java反射机制将Bean转成Map
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- 利用JAVA反射机制将JSON数据转换成JAVA对象
net.sf.json.JSONObject为我们提供了toBean方法用来转换为JAVA对象, 功能更为强大, 这里借鉴采用JDK的反射机制, 作为简单的辅助工具使用, 有些数据类型需要进行转 ...
- java反射机制的简单使用
java 反射机制 反射机制简介 参考地址 什么是反射机制 反射机制指程序在运行时能够获取自身的信息.在java中只要给定类的名字,就可以通过反射机制获得类的所有信息 反射机制的优缺点 首先了解一下动 ...
- Java反射机制的简单学习
今天看了一下Java的反射机制,就此记录一下. 首先,我们要先了解一下什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAV ...
随机推荐
- centos 安装mysql8.0.16
清除自带的mariadb > rpm -qa|grep mariadb mariadb-libs-5.5.44-2.el7.centos.x86_64 > rpm -e --nodeps ...
- centos删除指定名称的进程
vim kill_process.sh ----------------------------------- if [ "$1" = "" ]; then e ...
- vue-cli中的element-ui的主题更改
主题安装分为全局安装和局部安装(局部安装指的是项目内进行安装) 局部安装: 使用局部安装方便他人使用,他人直接安装主题需要的依赖就可以进行使用 局部安装的步骤 1.npm i element-them ...
- spring cloud 客户端负载均衡 - Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon实现的,Ribbon不像注册中心.网关那样需要单独部署,它是作为一个工具直接集成到 ...
- react项目添加本地音频
<audio src="./res/audio/alarm.mp3" autoplay="autoplay" loop="loop" ...
- phpstorm 2016.3.2 的最新破解方法
v2.0 最新的方式 第一:下载PHPStorm20173.2:(下载链接:windows) 第二:直接用浏览器打开 http://idea.lanyus.com/ ,点击页面中的“获得注册码”,然后 ...
- session中删除数组中的某一个值 - 购物车例子 - jsp
这篇随笔简单的讲一下在session中移除数组中的某一项内容,比如这里有一个购物车其中有两件商品,需要移除其中洗发水这一件商品. 其实在这个session对象中存储了一个数组,在订购页面时选择商品加入 ...
- "类"的讲稿
-----------------------面向对象基础------------------------------------方法(函数) { (c#p10为主,p27;javap96)+资料,讲 ...
- C# Newtonsoft.Json 你必须知道的一些用法
最近在做接口开发,对方团队开发了一个Web API 的接口,传输数据的格式是 JSON.当时看到这个东西,感觉很简单,也没想什么,没用多久就完成了我的功能,我完成的功能很简单,就是获取数据,然后把数据 ...
- prometheus消耗内存问题
参考: https://stackoverflow.com/questions/56115912/why-does-prometheus-consume-so-much-memory https:// ...