之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信、发送邮件。当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发。就是一个程序员和另一个程序员可以同时去书写代码,而不是一个程序员等到另一个程序员写完以后再去书写代码。其中的粘合剂就是接口和配置文件。

通过简单的工厂设计模式可以达到类的 解耦合目的,但是之前的工厂设计模式依然存在问题,那就是在增加一个子类时都需要修改工厂类,这样很麻烦。现在就可以通过反射机制修改工厂类,这样肯定会 非常麻烦。学习完反射机制之后,实际上,此时就可以通过反射机制来改善工厂类,让其在增加子类时可以不用做任何的修改,就能达到功能的扩充,如下:

/**
*
*/
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反射机制优化简单工厂设计模式的更多相关文章

  1. (转)java反射机制及简单工厂模式

    第一步,定义一个接口类 package factory.face; /** * 接口,为了保证返回的对象可以统一用 Product接受 * @author Administrator */ publi ...

  2. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  3. java反射机制的简单介绍

    参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...

  4. 利用JAVA反射机制设计通用的DAO

    利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,    那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...

  5. 利用Java反射机制对实体类的常用操作工具类ObjectUtil

    代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...

  6. 利用Java反射机制将Bean转成Map

    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...

  7. 利用JAVA反射机制将JSON数据转换成JAVA对象

    net.sf.json.JSONObject为我们提供了toBean方法用来转换为JAVA对象, 功能更为强大,  这里借鉴采用JDK的反射机制, 作为简单的辅助工具使用,   有些数据类型需要进行转 ...

  8. java反射机制的简单使用

    java 反射机制 反射机制简介 参考地址 什么是反射机制 反射机制指程序在运行时能够获取自身的信息.在java中只要给定类的名字,就可以通过反射机制获得类的所有信息 反射机制的优缺点 首先了解一下动 ...

  9. Java反射机制的简单学习

    今天看了一下Java的反射机制,就此记录一下. 首先,我们要先了解一下什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAV ...

随机推荐

  1. 关于Class: ES6 JavaScript的class的静态方法、属性和实例属性。

    1.什么叫做静态方法? 1.1.类相当于实例的原型, 所有在类中定义的方法, 都会被实例继承.如果在一个方法前,加上Static关键字,就表示该方法不会被继承,而是直接通过类来调用,这被称为 “静态方 ...

  2. Alpha冲刺——测试篇

    课程信息 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺 团队目标 切实可行的计算机协会维修预约平台 团队信息 队员学号 队员姓名 个人博客地址 备注 22 ...

  3. 不一样的LCA——luoguP1852跳跳棋

    洛谷端题目链接 loj端题目链接 题目大意: 在一条数轴上进行跳跳棋游戏.棋子只能摆在整点上.每个点不能摆超过一个棋子.用跳跳棋完成:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动 ...

  4. CentOS7安装Node_exporter(二进制)

    一.概述 Node_exporter是可以在* Nix和Linux系统上运行的计算机度量标准的导出器.Node_exporter 主要用于暴露 metrics 给 Prometheus,其中 metr ...

  5. Java Objective-C AOP

    Java Use an AOP library or byte-code engineering (BCEL, cglib, asm, etc) to create a sub-class on th ...

  6. JS实现文件自动上传

    JS引用: <script type="text/javascript" src="~/bootstrap/js/fileinput.min.js"> ...

  7. C语言----循环结构1(基础篇五)

    今天更新一个C语言的循环,简单点就是就是我们平时在使用电脑时不停的刷新网页,生活中每天都要吃饭等等就是循环,而编程中也有不断循环的过程,或者遇到符合的条件结束循环 下面进入今天的主题: 需求:用计算机 ...

  8. C#实现将字符串转换成代码并执行

    我们在写JavaScript程序的时候,有一个函数很有趣,eval(),这个方法非常有趣,他可以编译他内部的字符串,并将字符串按照JS代码执行,例如eval(‘alert(“message”)’),执 ...

  9. JQuery入门篇

    JQuery入门篇 jQuery选择器 “$”表示JQuery对象 根据ID查找 $(‘#var’)表示将一个id值为var的DOM节点封装成一个jQuery对象,DOM节点必须以“#”开头. 例如: ...

  10. Vertx与Spring配合完成DML操作

    服务启动: public static void main( String[] args ) { ApplicationContext context = new AnnotationConfigAp ...