设计模式-05.建造者模式与模板方法模式比较
发布日期:2021-05-20 05:12:39 浏览次数:12 分类:精选文章

本文共 3088 字,大约阅读时间需要 10 分钟。

Builder建造者模式的核心是通过引入一个监工类(Director),将构建步骤的管理和组合的责任与具体的Builder类区分开来,从而实现松耦合。下面将详细解释Builder模式及其在实际应用中的实现细节。

Builder模式的工作原理

  • Builder抽象类:定义一个接口或抽象类,包含若干个方法,每个方法代表一个构建步骤。这些方法的具体实现将由各个Builder子类来实现。

  • Builder子类:每个Builder子类(如HtmlBuilder、TextBuilder)专注于实现特定类型的文件构建,继承自Builder抽象类,并实现其定义的所有抽象方法。

  • Director监工类:负责组合Builder子类的各个构建步骤,并调用相应的方法来构造最终的文件。Director类通过调用Builder的方法,形成一个完整的构建流程。

  • 构造过程

    • 初始化:Director使用指定的Builder实例进行初始化。
    • 执行构建步骤:调用Builder子类的各个方法,逐步构建文件内容。
    • 返回结果:构建完成后,Director可能返回最终的结果或文件。
  • Builder模式的优点

  • 松耦合:Builder子类只需实现接口中的方法,不需要关心其他Builder子类的具体实现。Director负责组合这些步骤,减少了类之间的依赖关系。

  • 高内聚低耦合:Builder类集中处理构建过程,各自维护自己的状态和资源,避免了在一个类中处理多个相关但不相关的责任。

  • 可扩展性:只需在Builder和Director中添加新的构建步骤和相应的实现类,就可以支持新的文件类型或功能,不需要修改现有代码。

  • 面向接口编程:通过Director调用Builder的方法,其他Builder子类无需知道其他步骤是如何实现的,仅需遵循接口规范即可完成任务。

  • 代码示例

  • Builder抽象类
  • public abstract class Builder {    public abstract void makeTitle(String title);    public abstract void makeString(String str);    public abstract void makeItems(String[] items);    public abstract void close();}
    1. HtmlBuilder实现类
    2. public class HtmlBuilder extends Builder {    private String filename;    private PrintWriter pw;    public void makeTitle(String title) {        filename = "D://" + title + ".html";        try {            pw = new PrintWriter(new FileWriter(filename));            pw.println("" + title + "

      " + title + "

      "); } catch (IOException e) { e.printStackTrace(); } } public void makeString(String str) { pw.println("

      " + str + "

      "); } public void makeItems(String[] items) { pw.println("
        "); for (int i = 0; i < items.length; i++) { pw.println("
      • " + items[i] + "
      • "); } pw.println("
      "); pw.close(); } public String getResult() { return filename; }}
      1. Director监工类
      2. public class Director {    private Builder builder;    public Director(Builder builder) {        this.builder = builder;    }    public void construct() {        String[] items1 = {"奏国歌", "升国旗"};        String[] items2 = {"观众鼓掌", "有序撤离"};        builder.makeTitle("今日头条");        builder.makeString("毕业典礼");        builder.makeItems(items1);        builder.makeString("典礼结束");        builder.makeItems(items2);        builder.close();    }}
        1. Main类
        2. public class Main {    public static void main(String[] args) {        String choice = "html";        if (choice == "plain") {            TextBuilder t = new TextBuilder();            Director d = new Director(t);            d.construct();            System.out.println(t.getResult());        } else if (choice == "html") {            HtmlBuilder html = new HtmlBuilder();            Director d = new Director(html);            d.construct();            System.out.println(html.getResult());        } else {            usage();        }    }    private static void usage() {        System.out.println("使用 'plain',编辑文本文件");        System.out.println("使用 'html',编辑网页文件");    }}

          总结

          Builder模式通过将构建步骤的管理封装到Director类中,减少了Builder子类之间的耦合。这种设计理念使得系统更加灵活和可扩展,支持新的构建需求时仅需添加新的Builder子类和对应的Director的方法即可。这种设计方式既保持了代码的可维护性,又实现了接口的抽象化,使得系统具有更好的扩展性和可复用性。

    上一篇:深入学习三个月向大厂发起冲击
    下一篇:设计模式-02.工厂方法模式

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年04月12日 19时53分17秒