2017-08-09 91 views
0

我一直在努力,其是基於PHP Laravel框架的API,但是這是不特定的語言。在API中使用了許多第三方API,並且有多個配置。所以我想創建一個HTTP客戶端工廠類,並且在代碼中,我計劃爲此創建一個對象並將API名稱作爲參數傳遞。主要問題是如何根據特定API的名稱來解決這個問題?那就是當我給Google時,它需要初始化Google類並返回Google API客戶端和其他API,它應該使用相應的客戶端進行響應。如何使用工廠模式來解決多個第三方的API

我有這樣的困惑是一個正確的用例工廠模式,如果不是,是否有任何其他的模式或這樣做的,而不是單獨調用每個API客戶端的標準方法。?

+0

截至目前,它是單獨的類沒有任何關聯。是的,所有的類都應該以相同的方式使用。一旦我得到客戶,我可以爲特定的客戶調用特定的方法。 –

回答

1

在這裏,你需要使用工廠方法和適配器模式的組合。 Factory方法將創建您的本機API類的對象(例如Google等),並且適配器將爲您提供一個通用接口。所以基本上你做到以下幾點:

  • 您的API操作創建一個適配器接口(列出所有你所需要的操作)
  • 實現對所有不同的API適配器接口,通過參考 第三方API對象(你需要爲每個API不同類)
  • 在你的工廠方法,你回到你的適配器接口類型。
  • 現在,你可以消耗對象從工廠方法調用代碼返回。

下面是示例代碼。此是用C#。您可以對以下代碼進行一些修改。

public interface IApiAdapter 
{ 
    void Read(int id); 
    void Write(string data); 
} 

public class GoogleApiAdapter : IApiAdapter 
{ 
    private GoogleApiClass _googleApiClass; 
    public void Read(int id) 
    { 
     //some additional work 
     //call google api 
     _googleApiClass.readSomeData(id); 
    } 
    public void Write(string data) 
    { 
     //some additional work 
     //call google api 
     _googleApiClass.writeSomeData(data); 
    } 
} 

public class FacebookApiAdapter : IApiAdapter 
{ 
    private FacebookApiClass _facebookApiClass; 
    public void Read(int id) 
    { 
     //some additional work 
     //call facebook api 
     _facebookApiClass.readSomeData(id); 
    } 
    public void Write(string data) 
    { 
     //some additional work 
     //call facebook api 
     _facebookApiClass.writeSomeData(data); 
    } 
} 

public class ApiFactory 
{ 
    public static IApiAdapter GetApiFactory(string type) 
    { 
     if(type == "google") 
     { 
      return new GoogleApiAdapter(); 
     } 
     if(type == "facebook") 
     { 
      return new FacebookApiAdapter(); 
     } 
    } 
} 

//calling code 
IApiAdapter api = ApiFactory.GetApiFactory("google"); 
api.Read(2); 
+0

謝謝,Kunal。你能提供一些示例代碼嗎? –

+1

我已經用C#中的示例代碼編輯了我的答案 –