利用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 ...
随机推荐
- Markdown 编辑器指南
一直觉得博客园默认的编辑器不好用,后来了解了Markdown,并且博客园也支持Markdown标记,所以写篇博客总结下. 一.认识 Markdown Markdown 是一种用来写作的轻量级「标记语言 ...
- jdk 1.6 新特性
JDK1.6新特性 1.DestTop类和SystemTray类 前者用于调度操作系统中的一些功能,例如: · 可以打开系统默认浏览器指定的URL地址: · 打开系统默认邮件客户端给指定的邮箱发信息: ...
- docker 学习操作记录 1
记录1 Xshell (Build ) Copyright (c) NetSarang Computer, Inc. All rights reserved. Type `help' to learn ...
- 【转帖】netstat命令总结
netstat命令总结 https://www.cnblogs.com/chenqionghe/p/10654109.html nestat介绍 netstat是一款命令行工具,可用于列出系统上所有的 ...
- APIO2019简要题解
Luogu P5444 [APIO2019]奇怪装置 看到这种题,我们肯定会想到\((x,y)\)一定有循环 我们要找到循环节的长度 推一下发现\(x\)的循环节长为\(\frac{AB}{B+1}\ ...
- Java学习:面向对象的三大特征:封装性、继承性、多态性之继承性
面向对象的三大特征:封装性.继承性.多态性. 继承 继承是多态的前提 ,如果没有继承,就没有多态. 继承主要解决的问题就是:共性抽取. 继承关系当中的特点: 子类可以拥有父类的“内容” 子类还可以拥有 ...
- TServerSocket组件
主要作为服务器端的套接字管理器使用.它封装了服务器端的套接字.在打开套接字后,服务器端就处于监听状态,在接收到其它机器的连接请求后,与客户端建立连接,创建一个新的套接字,用于和客户端互传数据,此时TS ...
- 2019 途牛旅游网java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.途牛旅游网等公司offer,岗位是Java后端开发,因为发展原因最终选择去了途牛旅游网,入职一年时间了,也成为 ...
- cmd查找并杀死被占用的端口的进程
java开发启动server的时候经常会遇到端口被占用的错误提示, 如果不想更换服务配置的端口号,那么怎么解决端口被占用的情况呢? 1. cmd窗口输入netstat -ano ,在列表中查看被占用的 ...
- gulp与webpack的区别?是一种工具吗?
问:gulp和webpack什么关系,是一种东西吗?可以只用gulp,不用webpack吗 或者反过来?有什么区别? 答:gulp是工具链.自动化构建工具,可以配合各种插件,我们不用再做机械重复的工作 ...