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

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

/**
*
*/
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. kube-prometheus部署

    一.从git拉取相应yaml文件 git clone https://github.com/coreos/kube-prometheus.git 二.修改grafana及prometheus的serv ...

  2. MD5加盐与安全

    PHP开发者对md5()这个函数是熟悉不过了,很多开发者都使用md5('abc123')对用户密码进行加密处理,这样做没有错,但是安全性还是很低的,因为很多网站的用户数据都是用md5进行加密处理的,所 ...

  3. .netcore docker noe4j

    1.借用docker搭建noe4j环境 docker pull neo4j docker run -d --restart=always -p7474: -p7687: -v /root/docker ...

  4. golang ---Learn Concurrency

    https://github.com/golang/go/wiki/LearnConcurrency 实例1: package main import ( "fmt" " ...

  5. 调用WebApi出现 远程服务器返回错误: (500) 内部服务器错误

    一.检查错误错误 将 HttpWebResponse response = (HttpWebResponse)request.GetResponse();改为 HttpWebResponse resp ...

  6. 异常详细信息: System.Security.SecurityException: 未找到源,不过,未能搜索部分或所有事件日志。 若要创建源,您需要用于读取所有事件日志的权限以确保新的源名称是唯一的。 不可访问的日志: Security。

    “/”应用程序中的服务器错误. 安全性异常 说明: 应用程序尝试执行安全策略不允许的操作.要授予此应用程序所需的权限,请与系统管理员联系,或在配置文件中更改该应用程序的信任级别. 异常详细信息: Sy ...

  7. .NET中的异步编程——动机和单元测试

    背景 自.NET 4.5发布以来已经有很长一段时间了.留在了我们的记忆里,其发布在2012年8月15日.是的,六年前.感觉老了吗?好吧,我不打算让你做出改变,而是提醒你一些.NET发布的亮点.此版本带 ...

  8. Eclipse集成Git做团队开发

    在日常开发工作中,我们通常使用版本控制软件管理团队的源代码,常用的SVN.Git.与SVN相比,Git有分支的概念,可以从主分支创建开发分支,在开发分支测试没有问题之后,再合并到主分支上去,从而避免了 ...

  9. Matplotlib中figure、subplot、axes、axis的区别

    参考链接:https://blog.csdn.net/JasonZhu_csdn/article/details/85860963 画图板/画布: 这是一个基础载体,类似实际的画图板,用pyplot. ...

  10. ex_gcd求不定方程的最小正整数解

    #include<bits/stdc++.h> using namespace std; int gcd(int a,int b) {return b?gcd(b,a%b):a;} int ...