2017-08-09 54 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#中的示例代码编辑了我的答案 –