工廠設計模式結合Spring開發

本文以簡單工廠模式爲案例。

在上網看的工廠模式的案例講解中,創建具體實現類一般是簡單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);

    }

}

本文到此爲止.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章