本文以簡單工廠模式爲案例。
在上網看的工廠模式的案例講解中,創建具體實現類一般是簡單new一個出來。但是在實際開發中,一般都是結合Spring來管理對象的。下面分享一種結合Spring開發的工廠模式
業務場景:一個發送消息的功能模板。有不同的發送方式,如 站內信,短信,郵件等。先定義一個發送消息的接口
//發送消息接口
public interface IMessageSender{
void sendMessage(String userId,Map<String, Object> extParams); //extParams用來兼容多個實現類的入參
String getType(); //用於區分是什麼消息發送者
}
具體的發送消息實現類
/**
* 手機短信發送實現類
*/
@Service
class PhoneMessageSender implements IMessageSender{
@Override
public void sendMessage(String userId, Map<String, Object> extParams) {
System.out.println("---短信發送--");
}
@Override
public String getType() {
return "phoneMessage";
}
}
/**
* 站內信發送實現類
*/
@Service
class InMessageSender implements IMessageSender{
@Override
public void sendMessage(String userId, Map<String, Object> extParams) {
System.out.println("---站內信發送--");
}
@Override
public String getType() {
return "inMessage";
}
}
/**
* 郵件發送實現類
*/
@Service
class MailMessageSender implements IMessageSender{
@Override
public void sendMessage(String userId, Map<String, Object> extParams) {
System.out.println("---郵件發送--");
}
@Override
public String getType() {
return "mailMessage";
}
}
工廠類
/**
* 發送消息實現類的工廠
*/
@Component
class MessageSenderFactory{
@Resource
private List<IMessageSender> list;//注入所有的實現了IMessageSender的實現類
private static Map<String,IMessageSender> map; //轉成map存放
@PostConstruct
public void initMap(){
map = list.stream().collect(Collectors.toMap(IMessageSender::getType, obj -> obj));
}
public IMessageSender createSender(String type){
//轉給map並用type去指定唯一實現類,則省略了多個if else的代碼.
return map.get(type);
}
}
客戶端調用
class TestDoWork{
@Resource
private MessageSenderFactory messageSenderFactory;
public void doWork(){
//相關業務邏輯...
//發送郵件
IMessageSender mailMessageSender = messageSenderFactory.createSender("mailMessage");
mailMessageSender.sendMessage("1",null);
//發送站內信
IMessageSender inMessageSender = messageSenderFactory.createSender("inMessage");
inMessageSender.sendMessage("1",null);
}
}
本文到此爲止.