如何使用工厂模式解决多个第三方api

Hap*_*der 3 design-patterns factory-pattern

我一直在研究基于 PHP 中 Laravel 框架的 API,但这不是特定于该语言的。API 中使用了许多第三方 API,并且有许多多种配置。所以我想创建一个 HTTP 客户端工厂类,在代码中,我打算为此创建一个对象并将 API 名称作为参数传递。主要问题是如何根据特定 API 的名称将其解析为各种类?那就是当我给谷歌时,它需要初始化谷歌类并返回谷歌API客户端,对于其他API,它应该用相应的客户端响应。

我有一个困惑,比如这是工厂模式的正确用例,如果不是,是否有任何其他模式或标准方法可以做到这一点,而不是分别调用每个 API 客户端。?

tec*_*h-y 6

在这里,您需要结合使用工厂方法和适配器模式。工厂方法将创建您的原生 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);
Run Code Online (Sandbox Code Playgroud)