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

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

/**
*
*/
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. ORM之Entity Framework(EF)

    ORM之Entity Framework(EF) 一.下载安装: nuget 搜索Entity Framework安装 EntityFramework.Extension是个扩展库根据需要安装 二.使 ...

  2. 【java】获取客户端访问的公网ip和归属地

    import com.alibaba.druid.support.json.JSONUtils; import org.thymeleaf.util.StringUtils; import javax ...

  3. 修改ssh服务器默认端口号

    1.查看当前ssh服务器端口号 在修改ssh服务器的端口号之前,首先查看ssh服务器监听的端口号,使用netstat命令: $ sudo netstat -tunlp | grep "ssh ...

  4. thinkphp漏洞如何修复

    THINKPHP漏洞修复,官方于近日,对现有的thinkphp5.0到5.1所有版本进行了升级,以及补丁更新,这次更新主要是进行了一些漏洞修复,最严重的就是之前存在的SQL注入漏洞,以及远程代码执行查 ...

  5. Elasticsearch 记录

    查看集群运行状态 GET /_cat/health?v 响应 1573460861 16:27:41 my-application yellow 1 1 372 372 0 0 371 0 - 50. ...

  6. Docker 下的Zookeeper以及.ne core 的分布式锁

    单节点 1.拉取镜像:docker pull zookeeper 2.运行容器 a.我的容器同一放在/root/docker下面,然后创建相应的目录和文件, mkdir zookeeper cd zo ...

  7. Git系列 —— 记一次Mac上git push时总是403的错误

    问题: 今天从github上clone下一个项目,然后修改后git push时总是出现: remote:Permission to lixyou/rw-split-plugin.git defined ...

  8. pandas mode()填充nan异常问题

    df.mode()return的是一个frame,因为可能存在多个总数.那么用mode()来填充nan的时候就要注意了,如果直接 df.fillna(df.mode()) 会发现还是有很多空值没有填充 ...

  9. 命令创建.net core3.0 web应用详解(超详细教程)

    原文:命令创建.net core3.0 web应用详解(超详细教程) 你是不是曾经膜拜那些敲几行代码就可以创建项目的大神,学习了命令创建项目你也可以成为大神,其实命令创建项目很简单. 1.cmd命令行 ...

  10. vs2017添加引用提示“找不到 Microsoft.VisualStudio.Shell.Interop.IVsReferenceManager 服务的实例”解决方案

    vs2017添加引用提示“找不到 Microsoft.VisualStudio.Shell.Interop.IVsReferenceManager 服务的实例” 不知道是不是安装时候的问题?解决方法: ...