构建器/生成器模式Builder

news2024/11/28 2:53:49

1.意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.结构
在这里插入图片描述
Builder为创建一个Product对象的各个部件指定抽象接口。
ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。
Director构造一个使用Builder接口的对象。
Product表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成组件的类,包括将这些组件装配成最终产品的接口。
3.适用性
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同的表示时。
4.常见案例:一个产品构造(组成不同)
代码案例一
某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类披萨)、饮料和玩具,其餐品种类可能不同,但其制作过程相同。前台服务员(Waiter)调度厨师制作套餐。现采用生成器(Builder)模式实现制作过程。
软件设计师考试2017年上半年下午题第6题

public class Builder1 {
    public static void main(String[] args) {
        Waiter waiter = new Waiter();
        //生产一个夏威夷披萨
        PizzaBuilder huwaiianPizzaBuilder = new HawaiianPizzaBuilder();
        waiter.setPizzaBuilder(huwaiianPizzaBuilder);
        waiter.construct();
        System.out.println("pizza:" + waiter.getPizza());
    }
}
class Pizza{
    private String parts;
    public void setParts(String parts){
        this.parts = parts;
    }
    public String getParts(){
        return this.parts;
    }
    @Override
    public String toString() {
        return parts;
    }
}
abstract class PizzaBuilder{
    protected Pizza pizza;
    public Pizza getPizza(){
        return pizza;
    }
    public void createNewPizza(){
        pizza = new Pizza();
    }
    public abstract void buildParts();
}
class HawaiianPizzaBuilder extends PizzaBuilder{//夏威夷披萨
    @Override
    public void buildParts() {
        pizza.setParts("cross + mild + ham & pineapple");
    }
}
class SpicyPizzaBuilder extends PizzaBuilder{//意大利披萨
    @Override
    public void buildParts() {
        pizza.setParts("panbaked + hot + pepperoni & salami");
    }
}
class Waiter{
    private PizzaBuilder pizzaBuilder;
    public void setPizzaBuilder(PizzaBuilder pizzaBuilder){
        //设置构建器
        this.pizzaBuilder = pizzaBuilder;
    }
    public Pizza getPizza(){
        return pizzaBuilder.getPizza();
    }
    public void construct(){
        //构造
        pizzaBuilder.createNewPizza();
        pizzaBuilder.buildParts();
    }
}

运行结果
在这里插入图片描述
代码案例二
生成器(Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
软件设计师考试2018年上半年下午题第6题

public class Builder2 {
    public static void main(String[] args) {
        Director director1 = new Director(new ConcreateBuilder1());
        //产品1生产:partA1+partB1
        director1.construct();
        Director director2 = new Director(new ConcreateBuilder2());
        //产品2生产:partA2+partB2
        director2.construct();
    }
}
class Product{
    private String partA;
    private String partB;
    public Product(){

    }
    public void setPartA(String s){
        partA = s;
    }
    public void setPartB(String s){
        partB = s;
    }
    public String getPartA() {
        return partA;
    }
    public String getPartB() {
        return partB;
    }
}
interface Builder{
    void buildPartA();
    void buildPartB();
    Product getResult();
}
class ConcreateBuilder1 implements Builder{
    private Product product;
    public ConcreateBuilder1(){
        product = new Product();
    }
    @Override
    public void buildPartA() {
        product.setPartA("component A1");
    }
    @Override
    public void buildPartB() {
        product.setPartB("component B1");
    }
    @Override
    public Product getResult() {
        System.out.println(product.getPartA()+"||"+product.getPartB());
        return product;
    }
}
class ConcreateBuilder2 implements Builder{

    private Product product;
    public ConcreateBuilder2(){
        product = new Product();
    }
    @Override
    public void buildPartA() {
        product.setPartA("component A2");
    }
    @Override
    public void buildPartB() {
        product.setPartB("component B2");
    }
    @Override
    public Product getResult() {
        System.out.println(product.getPartA()+"||"+product.getPartB());
        return product;
    }
}
class Director{
    private Builder builder;
    public Director (Builder builder){
        this.builder = builder;
    }
    public void construct(){
        builder.buildPartA();
        builder.buildPartB();
        Product product = builder.getResult();
    }
}

运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/142939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验十五 IS-IS协议基本配置

实验十五 IS-IS协议基本配置IS-IS(中间系统到中间系统)协议与OSPF(开放最短路径优先)协议有许多类似之处, 如都是链路状态的IGP路由协议,采用的都SPF路由算法,都划分了区域。为了支持大规模 的路由网络,IS-IS在自治系统内采用骨丁…

四、MySQL 存储引擎及数据类型

文章目录一、前置知识二、MySQL 存储引擎(先了解,初步有个印象)2.1 MySQL 存储引擎的概念2.2 查询 MySQL 中支持的存储引擎2.3 InnoDB 存储引擎2.4 MyISAM 存储引擎2.5 MEMORY 存储引擎2.6 如何选择 MySQL 存储引擎?三、MySQL 数据类型3.1 数字类型3.2 日…

Dataway让SpringBoot不在需要Controller、Service、DAO、Mapper了

Dataway介绍 Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应用…

君子签用区块链打造电子合同证据链闭环,提升电子合同证据效力

电子合同作为电子证据的主要表现形式,采用电子合同发生纠纷时,相关的电子合同数据成为证据证明的关键。运用区块链去中心化、分布式存储、加密可溯源等技术特性,让电子合同的整个过程都可以在互联网上安全地进行,帮助打通数据信任…

JavaERP系统源码+数据库,业务闭环、灵活稳定的企业级ERP系统,真正的财务业务一体化系统

JavaERP系统源码数据库,业务闭环、灵活稳定的企业级ERP系统,真正的财务业务一体化系统 完整代码下载地址:JavaERP系统源码数据库 产品展示 社区版 主界面 权限模块 职员与组织 科目结构 库存管理 库存盘点 订单管理 出入库管理 凭…

【Spring【AOP】】——21、@EnableAspectJAutoProxy注解详解?

📫作者简介:zhz小白 公众号:小白的Java进阶之路 专业技能: 1、Java基础,并精通多线程的开发,熟悉JVM原理 2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线…

Docker二进制安装

目录 1、选择安装目录 2、了解默认安装 3、Docker网络了解 docker官网 1、选择安装目录 安装包下载 链接:https://pan.baidu.com/s/1mbUl2XLnlN4xZuHbvRF-vg?pwdpdoq 提取码:pdoq docker官网 1、选择安装目录 docker指定数据存储目录到 /data/…

mysql 乐观锁和悲观锁

悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中…

二叉树的一些练习题

前言 二叉树的简单题目,通过画栈帧图去理解过程。画一画,走一走递归过程,理解会更加深刻。 二叉树练习题前言二叉树的创建二叉树先序遍历创建PreCreat二叉树层次创建LevelCreat二叉树的销毁BinaryTreeDestory二叉树求节点个数BinaryTreeSize二…

关于C语言输入输出的逗号问题(小细节)

C语言的输入输出必须要遵循scanf和printf的格式&#xff0c;就是你是什么格式你就要输入什么。 一、输入问题 #include <stdio.h> int main() { int a,b;scanf("%d,%d",&a,&b);printf("ab%d",ab);return 0; } 这个程序我们可以看到它运行…

【雷达开源数据集 | 代尔夫特数据集(VOD),4D雷达、激光雷达和相机数据】

本文编辑&#xff1a;调皮哥的小助理 1、介绍 代尔夫特视图 &#xff08;VoD&#xff09; 数据集是一种新颖的汽车数据集&#xff0c;包含 8600 帧同步和校准的 64 层 LiDAR、&#xff08;立体&#xff09;摄像头和 31D 雷达数据&#xff0c;这些数据是在复杂的城市交通中采集…

《编码 - 代码分析》代码结构分析

1 代码结构分析概述 在编写代码时&#xff0c;要求要结构清晰、接口简单。如果代码结构过于复杂&#xff0c;会带来很多问题&#xff1a;代码很难被理解&#xff0c;不方便编写测试用例&#xff0c;容易隐藏错误&#xff0c;出现问题难以定位&#xff0c;修改代码容易产生新的…

基于Java+SpringBoot+vue+elementui的校园文具商城系统详细设计和实现

基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录基…

前端学习框架

一&#xff0c;学习路线图 https://roadmap.sh/ 二&#xff0c;学习资源整理 https://developer.mozilla.org/zh-CN/docs/Learn // 学习web 的各种资源网站 三&#xff0c;知识整理 将前端分为三步走 JavaScript 语言&#xff08;模块一&#xff09;CSS 和 HTML&#x…

【Latex】1.Latex环境的安装与配置

文章目录前言1 安装环境2. 下载texstudio前言 LaTeX&#xff08;LATEX&#xff0c;音译“拉泰赫”&#xff09;是一种基于ΤΕΧ的排版系统&#xff0c;由美国计算机学家莱斯利兰伯特&#xff08;Leslie Lamport&#xff09;在20世纪80年代初期开发&#xff0c;利用这种格式&a…

sqlmap之绕过云锁waf

sql注入不会绕过WAF&#xff1f;关注我&#xff0c;让我带你由简入难实战各个WAF&#xff0c;前天我们实战了安全狗的WAF&#xff0c;今天先来看看比它难度更高的云锁WAF&#xff0c;你会绕吗&#xff1f;看我带你将它拿下 目录 一&#xff1a;环境配置 1.云锁WAF 2.sqli-l…

本地数仓项目(二)——搭建系统业务数仓详细流程

1 说明 本文基于《本地数据仓库项目(一)——本地数仓搭建详细流程》业务数据&#xff0c;在本地搭建系统业务数仓。 根据模拟sql脚本生成业务数据&#xff0c;依次执行生成业务数据即可。 sql脚本提供如下 链接&#xff1a;https://pan.baidu.com/s/1WX3xVMQvAApSUZMobWLiLQ…

Vue-cli创建项目的目录结构与子父组件之间的通信

一、Vue脚手架的使用1、通过命令行使用vue-cli的指令创建&#xff1a;vue init webpack 项目名称build文件夹&#xff1a; 用于webpack打包配置文件夹config文件夹&#xff1a;与webpack相关的配置文件夹|——- index.js&#xff1a;可以改变项目默认的端口号node_moudles&…

Vue3/ Vite 的使用介绍 、Vite 方式工作流程 与 传统方式工作流程区别

一. Vite 的使用介绍 优势: &#x1f4a1;极速的服务启动 使用了原生的 ESM文件 无需打包 ⚡️ 轻量快速的热重在 始终极快的模块热重载 &#x1f6e0;️丰富的功能 对于 typescript jsx css 等支持开箱即用 &#x1f4e6; 等等 二.Vite 方式工作流程 与 传统方式工作流程…

千万不要把Request传递到异步线程里面!有坑!

前几天在网上冲浪的时候看到一篇技术文章&#xff0c;讲的是他把一个 request 请求传递到了线程池里面&#xff0c;然后遇到了一个匪夷所思的情况。 他写了这篇文章&#xff0c;把自己针对这个问题的探索过程分享了出来&#xff1a; 《springboot 中如何正确的在异步线程中使用…