这个设计模式有名字吗?(具有仅调用构造函数的实现的基类)

byx*_*xor 5 java oop inheritance design-patterns nomenclature

编辑:我意识到这种模式感觉很像currying,这是一种功能程序员在调用之前用来指定函数参数的技术.这里的区别在于我们在对象上讨论构造函数而不是简单地使用函数.


在整个几个项目中,我发现自己使用了这个奇怪的设计模式,我找不到它的名字.它有名字吗?也许这只是不好的做法,你告诉我.

设计模式

有了这种模式,你会......

  1. 没有抽象方法的抽象基类(我们稍后可以讨论).
  2. 基类的许多"实现".但是,这些实现仅用于调用基类的构造函数.

Java示例(假设场景)

我将定义一个假设的场景来提供一些上下文.

场景:

Bob正在编写一个用于扫描源代码的小API.他希望能够检查注释是否在源代码中的给定索引处开始/结束.

这是鲍勃的代码.

1.抽象基类

public abstract class CommentDetector {

    private final String startPattern;
    private final String endPattern;

    protected CommentDetector(String startPattern, String endPattern) {
        this.startPattern = startPattern;
        this.endPattern = endPattern;
    }

    public boolean commentStartsAt(int index, String sourceCode) {
        // ...
    }

    public boolean commentEndsAt(int index, String sourceCode) {
        // ...
    }

}
Run Code Online (Sandbox Code Playgroud)

您可能想知道为什么它是抽象的但没有抽象方法.这只是因为Bob 不希望您直接实例化它.Bob希望你编写一个实现,CommentDetector然后实例化.以下是Bob的两个实现......

2.一些实施

一个用于Java中的多行注释:

public class JavaMultiLineCommentDetector extends CommentDetector {

    public JavaMultiLineCommentDetector() {
        super("/*", "*/");
    }
}
Run Code Online (Sandbox Code Playgroud)

一个用于Java中的单行注释:

public class JavaSingleLineCommentDetector extends CommentDetector {

    public JavaSingleLineCommentDetector() {
        super("//", "\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

Bob已经为我们编写了这些实现,以便我们可以编写new JavaMultiLineCommentDetector()代替new CommentDetector("/*", "*/").

如果需要,Bob还鼓励您为其他语言编写自己的实现.


摘要

  • 感觉就像这种设计模式的目的是通过预先定义构造函数调用来提高代码的可读性.

  • 这种设计模式赋予代码多态感(即使它可能/可能不是真正的多态).

  • 编写新的实现快速而简单.

  • 实现不依赖于彼此,可以独立编译/部署.

这个设计模式有名字吗?

cha*_*lie 1

使用可扩展枚举模式(已在注释中注明),您还可以避免继承:

public interface CommentDelimiter {
    String getStartPattern();
    String getEndPattern();
}

public interface CommentDetector {
    boolean commentStartsAt(int index, String sourceCode);
    boolean commentEndsAt(int index, String sourceCode);
}

public enum CommentDetectors implements CommentDetector {
    JAVA_MULTILINE(CommentDelimiters.JAVA_MULTILINE),
    JAVA_SINGLELINE(CommentDelimiters.JAVA_SINGLELINE);

    // ... store commentDelimiter

    public boolean commentStartsAt(int index, String sourceCode) {
        // ... using commentDelimiter.getStartPattern()
    }

    public boolean commentEndsAt(int index, String sourceCode) {
        // ... using commentDelimiter.getEndPattern()
    }
}

public enum CommentDelimiters implements CommentDelimiter {
    JAVA_MULTILINE("/*", "*/"),
    JAVA_SINGLELINE("//", "\n");

    // ... store start, end
}
Run Code Online (Sandbox Code Playgroud)