1. 程式人生 > >【設計模式】工廠模式(Factory Pattern)

【設計模式】工廠模式(Factory Pattern)

什麽 接口 運行 不同 int 情況 att 不知道 local

【前言】

很多時候我們編寫了好幾個接口的實現類,這些實現類分別有不同特性,用在不同的情景下。**而我們對於這些實現類,也往往不會對外暴露內部增加的方法,只希望外部調用接口的方法,在這種情況下,我們沒必要讓調用者知道實現類,只需要提供一個方法讓調用者使用從而創建具有不同特性的接口實例。**而這個方法我們通常寫在一個叫工廠類的類裏面,從而對應這個接口,這樣調用者可以根據自身需要選擇具有不同特性的接口實例,又避免了實現類和外部調用者耦合的問題。

【特點】
  1. 工廠模式屬於創建型的設計模式(用於創建對象),由工廠對象提供方法創建接口的實例。

  2. 在工廠模式中,創建對象時不會對外暴露創建邏輯,即外部不知道創建出來的實際類型是什麽。

  3. 一個接口對應一個工廠類(一個接口伴隨一個工廠類),可以歸納為一對一關系。

【適用】
  1. 只提供接口實例給外部使用,而且外部只能使用接口的方法,否則工廠模式不適合。

  2. 對外提供的接口有兩個以上的不同實現方式(運行特性不同),否則工廠模式不合適。

【例子】

有一個需求,需要向外部提供一個日誌打印器,根據不同情況,可以在服務器打印,本地打印,控制臺打印日誌。

這裏我們先定義一個接口Logger:

public interface Logger{
    public void log(String text);    
}

根據上面所說的,也有一個工廠類對應:

public Logger getLogger(String type){
     
if(type.equals("server")){ return new ServerLogger(); }else if(type.equals("file")){ return new FileLogger(); }else if(type.equals("local")){ return new LocalLogger(); } return null; }

【實例】

在Android開發中,通常我們都會有圖片上傳的需求。曾經有次經歷過這樣的需求,圖片上傳到服務器中然後返回圖片路徑(用於後面的接口作為其中一個Post參數),後來業務變更了,接入第三方圖片上傳存儲服務,也是調用SDK上傳圖片返回圖片路徑。

這個時候就很合適使用工廠模式來適應這種業務變更,首先定義一個圖片上傳接口,通過工廠類獲得不同的圖片上傳對象。這樣如果以後圖片上傳業務再次變更,那麽只需要在工廠類內部增加創建新實例的邏輯,外部只需要修改創建實例的方法的傳入參數。

代碼場景:

// 原來代碼
PicInterface pic = PicFacetory.getPic("OriginServer"); 
// 新代碼
PicInterface pic = PicFacetory.getPic("ThirdPartSDK"); 
// 上傳,upload方法是實現接口的方法
String url = pic.upload(fileObj);

【設計模式】工廠模式(Factory Pattern)