使用反射建立一个用于生产短信对象的工厂方法
2017-10-11 20:40
597 查看
先说说场景,一个系统,有几个功能需要用到短信功能,比如登录,忘记密码,更改手机号,更改密码等。那么需要一个接口,统一发送这些短信,从代码重用和抽象的角度来讲,需要实现一个短信积累,具有一些短信的具体功能,并且通过客户端的参数可以自动选择发送内容。
我提供的内容是在原有基础上更改过多次的,先贴出代码,短信鸡肋,他可以存放phone(手机号)和type(短信的具体类别,一般从客户端传来)
然后是几个短信子类,他们的特点就是构造方法里调用了setType方法,为什么要这样调用后面再说
最后看看工厂方法类,这个类相当于一个工具类,他的create方法可以返回短信实体,从面向对象角度来讲返回值类型为基础类可以让这个方法返回基类的各种子类。
看调用create前,static里的代码就已经被执行完毕了,这个是static的特性,然后里面创建了一个map对象,对象存放了3个键值对,而key就是之前子类的type值,value是子类的class路径,在调用create方法时,会通过客户端传来的type找到map里对应的实体类class路径,然后通过反射创建对象,对象的类型是AbstractMessage的。需要注意的是子类的type必须和客户端传来的type值一样,那样才能正常创建对象,否则会出现异常。其实这个模式的思想就是把短信的创建权利交给客户端,而且如果要新增类只要添加class和在工厂类的static块里多一个put操作,和开闭原则相符,即对新增开放对修改关闭,不过实际开发中并不一定要死报着这个思想,要灵活运用。
我提供的内容是在原有基础上更改过多次的,先贴出代码,短信鸡肋,他可以存放phone(手机号)和type(短信的具体类别,一般从客户端传来)
public abstract class AbstractMessage { private String phone; private String type; public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getType() { return type; } public void setType(String type) { this.type = type; } AbstractMessage(){ super(); } AbstractMessage(String type){ setType(type); } }
然后是几个短信子类,他们的特点就是构造方法里调用了setType方法,为什么要这样调用后面再说
public class LoginMessage extends AbstractMessage{ public static final String type = "3"; LoginMessage(){ setType(type); } }
public class RegisterMessage extends AbstractMessage { public static final String type = "2"; RegisterMessage(){ setType(type); } }
public class RememberPasswordMessage extends AbstractMessage { public static final String type = "1"; public RememberPasswordMessage() { setType(type); } }
最后看看工厂方法类,这个类相当于一个工具类,他的create方法可以返回短信实体,从面向对象角度来讲返回值类型为基础类可以让这个方法返回基类的各种子类。
看调用create前,static里的代码就已经被执行完毕了,这个是static的特性,然后里面创建了一个map对象,对象存放了3个键值对,而key就是之前子类的type值,value是子类的class路径,在调用create方法时,会通过客户端传来的type找到map里对应的实体类class路径,然后通过反射创建对象,对象的类型是AbstractMessage的。需要注意的是子类的type必须和客户端传来的type值一样,那样才能正常创建对象,否则会出现异常。其实这个模式的思想就是把短信的创建权利交给客户端,而且如果要新增类只要添加class和在工厂类的static块里多一个put操作,和开闭原则相符,即对新增开放对修改关闭,不过实际开发中并不一定要死报着这个思想,要灵活运用。
public abstract class MessageFactory { private static Map<String,String>messageType; static { messageType = new HashMap<>(); messageType.put(RememberPasswordMessage.type,"create.factory.customFactory.RememberPasswordMessage"); messageType.put(LoginMessage.type, "create.factory.customFactory.LoginMessage"); messageType.put(RegisterMessage.type,"create.factory.customFactory.RegisterMessage"); } public static AbstractMessage createMessage(String type){ String className = messageType.get(type); try { Class<?> aClass = Class.forName(className); return (AbstractMessage) aClass.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } return null; } }
相关文章推荐
- 使用反射建立一个用于生产短信对象的工厂方法
- MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便
- 深度复制一个对象方法。利用反射机制,不使用Serialization,也不使用ICloneable接口
- js一个典型的对象写法,推荐使用这种格式,用于处理图像的基本方法、
- 私有方法是封闭的?使用反射来调用一个对象的私有方法。
- MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便
- 创建一个用于建立快捷方式的COM 对象并取得IShellLink 接口。
- 用一个实例学习VBS中使用fso对象的基本方法
- 编写一个文件,读取 src 下面day12包 下面的my.properties 文件,文件内容如下, className=day12.User 结合 IO、反射知识,完成 配置文件中对象的创建和方法调用。并编写方法,列举出 Student 类中所有的属性、
- 建立和使用包含static方法的对象类型
- LINQ下使用三层架构的探索(四)建立一个逻辑访问层,并且添加一些查询方法
- 在使用反射中,Object代表一个数组对象,如何转化为数组
- 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember。对该方法的声明如下(摘抄于MSDN)
- 在工厂模式里面利用反射机制动态调用对象方法
- 使用工厂方法mock测试方法体内中new出来的对象
- 使用反射等方法来操作对象、方法、属性
- 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember。对该方法的声明如下(摘抄于MSDN):
- 一个用于多种数据库连接,并且可以反射出自定义类型对象的DBHelper
- 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember。对该方法的声明如下(摘抄于MSDN):
- 使用反射-动态创建对象及调用对象方法