Java设计模式之建造者模式

建造者模式,又称生成器模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

三个角色:建造者具体的建造者监工使用者

  • 建造者角色:定义生成实例所需要的所有方法;
  • 具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
  • 监工角色:定义使用建造者角色中的方法来生成实例的方法;
  • 使用者:使用建造者模式。

注意 :定义中"将一个复杂的构建过程与其表示相分离",表示并不是由建造者负责一切,而是由监工负责控制(定义)一个复杂的构建过程,由各个不同的建造者分别负责实现构建过程中所用到的所有构建步骤。不然,就无法做到"使得同样的构建过程可以创建不同的表示"这一目标。

建造者角色:

java 复制代码
public abstract class Builder {
    public abstract void buildPart1();
    public abstract void buildPart2();
    public abstract void buildPart3();
}

监工角色:

java 复制代码
public class Director {    // 将一个复杂的构建过程与其表示相分离
    private Builder builder;    // 针对接口编程,而不是针对实现编程
    public Director(Builder builder) {
        this.builder = builder;
    }
    public void setBuilder(Builder builder) {
        this.builder = builder;
    }

    public void construct() {   // 控制(定义)一个复杂的构建过程
        builder.buildPart1();
        for (int i = 0; i < 5; i++) {   // 提示:如果想在运行过程中替换构建算法,可以考虑结合策略模式。
            builder.buildPart2();
        }
        builder.buildPart3();
    }
}

具体的建造者角色:

java 复制代码
/**
 * 此处实现了建造纯文本文档的具体建造者。
 * 可以考虑再实现一个建造HTML文档、XML文档,或者其它什么文档的具体建造者。
 * 这样,就可以使得同样的构建过程可以创建不同的表示
 */
public class ConcreteBuilder1 extends Builder {
  private StringBuffer buffer = new StringBuffer();//假设 buffer.toString() 就是最终生成的产品

    @Override
    public void buildPart1() {//实现构建最终实例需要的所有方法
        buffer.append("Builder1 : Part1\n");
    }

    @Override
    public void buildPart2() {
        buffer.append("Builder1 : Part2\n");
    }

    @Override
    public void buildPart3() {
        buffer.append("Builder1 : Part3\n");
    }
    
    public String getResult() {//定义获取最终生成实例的方法
        return buffer.toString();
    }
}

客户角色:

java 复制代码
public class Client {
    public void testBuilderPattern() {
        ConcreteBuilder1 b1 = new ConcreteBuilder1();//建造者
        Director director = new Director(b1);//监工
        director.construct();//建造实例(监工负责监督,建造者实际建造)
        String result = b1.getResult();//获取最终生成结果
        System.out.printf("the result is :%n%s", result);
    }
}
相关推荐
直奔標竿24 分钟前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
金銀銅鐵1 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
野生技术架构师3 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
小袁拒绝摆烂3 小时前
多表关联大平层转JSON树形结构
java·json
ja哇4 小时前
大厂面试高频八股
java·面试·职场和发展
yoyo_zzm4 小时前
Laravel6.x新特性全解析
java·spring boot·后端
Nick_zcy4 小时前
小说在线阅读网站和小说管理系统 · 功能全解析
java·后端·python·springboot·ruoyi
源码宝4 小时前
基于 SpringBoot + Vue 的医院随访系统:技术架构与功能实现
java·vue.js·spring boot·架构·源码·随访系统·随访管理
huzhongqiang4 小时前
Python 单例模式的几种实现方式:朴素才是王道
设计模式