java - 具有参数化方法的工厂模式

标签 java code-duplication factory-method

这些是一组遵循相同算法的服务。消费者调用这些服务,服务将消费者的请求发送到某个后端系统。服务接口(interface)是RESTful,后端是SOAP。因为它们都遵循相同的模式,所以我们有一个抽象类。方法的顺序是固定的,即 commonMethodOne 需要在 commonMethodTwo 之前发生,依此类推。

具体类必须实现两个抽象方法,因为每个服务接口(interface)都不同。

public abstract class CommonService<T1, T2, T3, T4> {

    public T4 getResponse(T1 request) {
        T2 backendRequest = transformClientRequestToBackendRequest(request);
        commonMethodOne(request);
        commonMethodTwo(request);
        T3 backendResponse = getBackendResponse(backendRequest);
        commonMethodThree(backendResponse);
        commonMethodFour(backendResponse);
        return transformBackendResponseToClientResponse(backendResponse);
    }

    public abstract T2 transformClientRequestToBackendRequest(T1 request);

    public abstract T4 transformBackendResponseToClientResponse(T3 backendResponse);

    public void commonMethodOne(T1 request) {
        //some code
    }

    public void commonMethodTwo(T1 request) {
        //some code
    }

    public void commonMethodThree(T3 backendResponse) {
        //some code
    }

    public void commonMethodFour(T3 backendResponse) {
        //some code
    }

    public T3 getBackendResponse(T2 backendRequest) {
        // call to backend system
    }
}

问题如下。 95%的服务都会遵循这种模式。但是,一小部分人需要客户端请求才能将后端响应转换为客户端响应。

所以方法:

公共(public)抽象 T4 TransformBackendResponseToClientResponse(T3 backendResponse);

会变成:

公共(public)抽象 T4 TransformBackendResponseToClientResponse(T1 clientRequest, T3 backendResponse);

但是,这仅适用于一小部分服务。因此,我不想向 95% 的服务添加另一个抽象方法,也不想更改签名以保留一种方法,因为这将是对具体类的更改。另一种解决方案是拥有一个包含公共(public)方法的父抽象类和两个子抽象类。每个抽象类都有不同风格的 transformBackendResponseToClientResponse,但 getResponse 必须在每个抽象类中重复。

如何在不重复代码的情况下实现这一点?

最佳答案

一种选择是在大约 5% 的场景中使用额外的接口(interface)。该接口(interface)可能如下所示,并且您的具体类将定义为 extends CommonService Implements LessCommonInterface:

interface LessCommonInterface<T1, T3, T4> {
    T4 transformBackendResponseToClientResponse(T1 clientRequest, T3 backendResponse);
}

另一个选择可能是创建第二个抽象类来扩展第一个抽象类。这样,大约 95% 的具体类将被定义为 extends CommonService,而大约 5% 将被定义为 extends LessCommonService:

abstract class LessCommonService<T1, T2, T3, T4> extends CommonService {
    public abstract T4 transformBackendResponseToClientResponse(T1 clientRequest, T3 backendResponse);
}

另一种选择是像您当前所做的那样使用单个抽象类,并更改 95% 和 5% 用例的签名以传递某种始终包含 T1 对象,有时 包含 T3 对象,但这种代码很困惑,随着时间的推移可能会产生问题。

关于java - 具有参数化方法的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59903160/

相关文章:

java - 工厂方法模式的优势

TypeScript Generic Factory Function Type,匹配数组元素顺序

java - 如何使 Java 类只能在同一个库中访问(在 Java 8 中)

java - 从 cassandra DB 检索数据后创建 RDD

c# - 多个项目之间的重复功能

Java OOP 优化代码

java - 重复代码命令类 Java

ios - 使用指定的初始化时,属性的Objective-C复制属性不起作用

java - Windows 10 上的 Wildfly 10.1.0.Final 在 "Starting deployment"上挂起至少 2 分钟

Java重载和覆盖