使用反射建立一个用于生产短信对象的工厂方法
為什么80%的碼農都做不了架構師?>>> ??
????????先說說場景,一個系統,有幾個功能需要用到短信功能,比如登錄,忘記密碼,更改手機號,更改密碼等。那么需要一個接口,統一發送這些短信,從代碼重用和抽象的角度來講,需要實現一個短信積累,具有一些短信的具體功能,并且通過客戶端的參數可以自動選擇發送內容。
????? ? 我提供的內容是在原有基礎上更改過多次的,先貼出代碼,短信雞肋,他可以存放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;} }?
轉載于:https://my.oschina.net/wwwd/blog/1549285
總結
以上是生活随笔為你收集整理的使用反射建立一个用于生产短信对象的工厂方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: reactJS -- 13 JSX样式与
- 下一篇: RabbitMQ入门-消息派发那些事儿