寻找一种设计模式,它可以创建具有不同接口实现的类的不同实例

本文关键字:实现 实例 创建 接口 一种 设计模式 寻找 | 更新日期: 2023-09-27 18:18:17

我有一个包含视图依赖项(所有接口)的类。基本上,类的行为是通过这些接口的实现来定义的。我希望能够有一个"构建器",可以创建这个类的实例与接口的不同实现(或它的一部分)。像这样:

public class API
{
 private readonly ISomeInterface _someInterface;
 private readonly ISomeOtherInterface _someOtherInterface;
 private readonly ISomeAnotherInterface _someAnotherInterface;
API(ISomeInterface someInterface,ISomeOtherInterface someOtherInterface,ISomeAnotherInterface someAnotherInterface)
{*/implementation ommitted*/}
//Example method
public void DoSomethingWhichDependsOnOneOrMoreInterfaces()
{
  //somecode
  id(_someInterface != null)
     _someInterface.SomeMethode();
}

public class MyApiBuilder()
{
  // implementation ommitted
  API CreateAPI(someEnum type)
  { 
    switch(type)
    {
       case SpecificAPI32:
            var speficImplementationOfSomeInterface = new ImplementsISomeInterface();
            speficImplementationOfSomeInterface .Setup("someSetup");
            var specificImplementationOfOtherInterface = new ImplementsISomeOtherInterface();
            returns new API(speficImplementationOfSomeInterface,specificImplementationOfOtherInterface ,null);
    }
  }
}

实现这一点的最优雅的方式是什么(如果这有意义的话)?我首先想到的是Builder设计模式,但据我所知,它略有不同。

[编辑]正如所指出的,我实现它的方式是一个工厂方法,但我并不完全满意。API可以包含各种不同的接口,这些接口可以完全相互独立,但有些接口可能依赖于其他接口。(但不是强制性的)我想给用户(使用这个"API"的开发人员)尽可能多的自由来创建他想要使用的API。让我们试着解释一下我基本上在做什么:假设我正在为游戏引擎开发一个插件,它可以在各种社交媒体渠道上发布成就和其他内容。所以基本上可以有一个接口实现对twitter,facebook,youtube等的访问或者一些自定义服务器。这个自定义服务器可能需要某种身份验证过程。用户应该能够在一开始就以一种很好的方式构建API(嗯,流畅是很好的…)。基本上是这样的:

var myTotallyForMyNeedsBuildAPI = API.CreateCustomApi().With(Api.Twitter).And(Api.Facebook).And(Api.Youtube).And(Api.CustomServer).With(Security.Authentification);

我实际上不知道如何使它流畅,但是像这样的东西会很好。

寻找一种设计模式,它可以创建具有不同接口实现的类的不同实例

使用依赖注入是一个很好的实践,因为你想让程序员能够用所需的配置组成对象。

检查MEFUnity框架,它们非常适合这项工作。

例如在Unity中,你可以这样写:

// Introducing an implementation for ISomeInterface
container.Register<ISomeInterface, SomeImplementation>();
// Introducing an implementation for ISomeOtherInterface
container.Register<ISomeOtherInterface, SomeOtherImplementation>();
// Introducing an implementation for ISomeAnotherInterface
container.Register<ISomeAnotherInterface, SomeAnotherImplemenation>();
container.Register<API, API>();
// and finally unity will compose it for you with desired configurations:
var api = container.Resolve<API>();

在这种情况下,api将由组成和所需的实现。

您所实现的是工厂方法模式。

对于你想要做的事情来说,这是非常好的,但是你可以根据你的上下文和你认为你的代码在未来将如何发展,看看其他工厂模式(例如这里)。

无论如何,我也会考虑不将这三个接口绑定在一个工厂中。如果它们真的紧密地结合在一起,可以一起使用和一起构建,那么它们首先就不应该是三个不同的接口,或者至少这三个接口都由同一个类实现,因此您的工厂将使用这些接口的适当实现来构建适当的类。

可能你想要的是Decorator模式。在API类中,如果每个接口已提供给API实例,则调用它们,这是Decorator模式的行为。使用此模式,您将获得一个模块化实现,它允许您向API添加多个行为。