责任链中的SimpleFactory

问题描述 投票:0回答:1

有一种观点认为,当使用责任链模式时(https://refactoring.guru/design-patterns/chain-of-responsibility/php/example),应该使用简单工厂创建请求。在这种情况下,工厂本身就必须通过DI来。争论的焦点是为解决方案编写单元测试更容易。请分享您对此事的看法。 Php、symfony 3 框架

当前实施:

$createRequest = new CreateRequest($input);
$updateRequest = UpdateRequest::createFromRequest($createRequest);
$updateRequest->status = 2;

$createHandler = new CreateHandler($createRequest);
$updateHandler = new UpdateHandler($updateReques);
$createHandler->setNext($updateRequest);
$createHandler->handle();
php design-patterns dependency-injection
1个回答
0
投票

争论的焦点是为解决方案编写单元测试更容易。

是的,确实如此,而且它还增强了关注点分离。我的意思是一个班级只有一个目标。

抱歉我对 PHP 不熟悉。让我通过 C# 展示一个示例。假设我们有一些应该根据用户输入调用的各种 API。

因此用户输入的代码如下所示:

public enum UserInput
{
    One, Two, Three
}

BaseApi 的抽象类看起来像这样:

public abstract class BaseApi
{
    public DateTime StartDateTime { get; set; } = DateTime.Now;

    public abstract string Get();
}

具体的实现是这样的:

public class WeatherApi : BaseApi
{
    public override string Get() => "I am weather API. Object created: " 
        + StartDateTime.ToString();
}

public class TemperatureApi : BaseApi
{
    public override string Get() => "I am temperature Api. Object created:"
       + StartDateTime.ToString();
}

然后 APIFactory 看起来像这样:

public class ApiFactory
{
    private Dictionary<UserInput, BaseApi> _apiByUserInput;

    public ApiFactory()
    {
        _apiByUserInput = new Dictionary<UserInput, BaseApi>()
        {
            { UserInput.One, new WeatherApi() },
            { UserInput.Two, new TemperatureApi() }
        };
    }

    public BaseApi GetInstance(UserInput userInput) => _apiByUserInput[userInput];
}

所以可以看出,您可以轻松测试您的

ApiFactory
,而且实现起来非常简单。

© www.soinside.com 2019 - 2024. All rights reserved.