设计模式-建造者(生成器)模式

文章目录

  • 简介
  • 建造者模式的核心概念
    • 产品(Product)
    • 建造者(Builder)
    • 指挥者(Director)
    • 建造者模式与其他设计模式的关系
      • 工厂模式和建造者模式uml对比
  • 建造者模式的实现步骤
  • 建造者模式的应用场景
    • spring中应用
  • 建造者模式的优缺点
    • 优点
    • 缺点
  • 简单总结

简介

在本文中,我们将介绍建造者模式的概念、作用和优势,并探讨它与其他设计模式的关系。

建造者模式的核心概念

在这里插入图片描述

产品(Product)

产品是由建造者创建的复杂对象,它具有多个属性和方法。在建造者模式中,产品是建造者的最终结果。

建造者(Builder)

建造者是负责构建产品的接口。它定义了创建产品的步骤和方法,通常包括设置属性和返回最终产品的方法。

指挥者(Director)

指挥者是负责协调建造者的对象。它指导建造者按照特定的顺序执行构建步骤,以生成最终产品。

建造者模式与其他设计模式的关系

建造者模式通常与以下设计模式相关联:

  • 抽象工厂模式:抽象工厂模式用于创建一系列相互依赖或相互关联的对象,而建造者模式用于创建复杂对象。两者的区别在于,抽象工厂模式强调一系列产品的创建,而建造者模式则侧重于单个复杂对象的创建。
  • 工厂模式:工厂模式用于根据某些条件创建不同类型的对象,而建造者模式则用于创建复杂对象。两者的区别在于,工厂模式强调对象类型的选择,而建造者模式侧重于对象的组装过程。

工厂模式和建造者模式uml对比

在这里插入图片描述
在这里插入图片描述

建造者模式的实现步骤

以下是实现建造者模式的步骤:

  1. 定义产品的属性和方法,确保产品具有所需的特性。
  2. 创建抽象建造者接口,其中包含创建产品的方法和设置产品属性的方法。
  3. 创建具体建造者类,实现建造者接口,并实现创建产品和设置属性的方法。
  4. 实现指挥者类,它接收一个建造者对象,并根据特定的顺序调用建造者的方法来构建产品。
  5. 编写客户端代码,实例化指挥者和具体建造者对象,并调用指挥者的构建方法来获取最终产品。

以下是一个示例代码:

// 产品类
public class Product {
    private String attribute1;
    private String attribute2;
    
    // 设置属性的方法
    public void setAttribute1(String attribute1) {
        this.attribute1 = attribute1;
    }
    
    public void setAttribute2(String attribute2) {
        this.attribute2 = attribute2;
    }
        public void Show(){
        System.out.println(attribute1);
        System.out.println(attribute2);
    }
    // 其他方法...
}

// 抽象建造者接口
public interface Builder {
    void buildAttribute1(String attribute1);
    void buildAttribute2(String attribute2);
    Product getResult();
}

// 具体建造者类
public class ConcreteBuilder implements Builder {
    private Product product;
    
    public ConcreteBuilder() {
        this.product = new Product();
    }
    
    @Override
    public void buildAttribute1(String attribute1) {
     System.out.println("设置Attribute1");
        product.setAttribute1(attribute1);
    }
    
    @Override
    public void buildAttribute2(String attribute2) {
     System.out.println("设置Attribute2");
        product.setAttribute2(attribute2);
    }
    
    @Override
    public Product getResult() {
        return product;
    }
}

// 指挥者类
public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct() {
    	System.out.println("指挥建造开始-----------");
        builder.buildAttribute1("Value 1");
        builder.buildAttribute2("Value 2");
        // 还可以按照特定顺序调用其他建造者方法
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        
        director.construct();
        
        Product product = builder.getResult();
        product.Show();
        // 使用产品...
    }
}

在这里插入图片描述

建造者模式的应用场景

建造者模式常用于以下情况:

  • 创建复杂对象,其中对象的创建过程较为复杂,需要多个步骤和组件参与。
  • 对象的构建过程需要独立于其组装方式,允许在同一个构建过程中使用不同的建造者来创建不同的表示。
  • 希望改变产品的内部表示,而不影响产品的整体结构。

spring中应用

在 Spring 框架中,建造者模式的应用主要体现在 Bean 的创建和配置过程中。Spring 使用了建造者模式来构建和配置各种类型的 Bean。

具体来说,Spring 中的建造者模式主要包括以下几个核心组件:

  1. ApplicationContext(应用上下文):在 Spring 中,通常使用 ApplicationContext 来管理和配置 Bean。ApplicationContext 负责创建和管理 Bean,并负责处理 Bean 的依赖关系和生命周期等。ApplicationContext 可以通过 XML 配置文件、注解或 Java 代码来配置和创建 Bean。

  2. BeanDefinitionBuilder:BeanDefinitionBuilder 是 Spring 提供的一个用于构建 BeanDefinition(Bean 定义)的建造者类。BeanDefinitionBuilder 提供了一系列的方法,用于配置 Bean 的各个属性和依赖关系等。通过链式调用这些方法,可以根据需求设置 BeanDefinition 的各个属性。

  3. BeanFactory:BeanFactory 是 Spring 的核心接口之一,它负责创建和管理 Bean。在创建 Bean 时,通常会使用 BeanFactory 来创建 Bean 实例,并将其配置和初始化。

  4. XML 配置文件:在 Spring 中,可以使用 XML 配置文件来配置和描述 Bean 的信息。XML 配置文件中的 元素通常对应着一个 Bean 对象,通过配置元素的属性和子元素,可以设置 Bean 的各个属性和依赖关系等。

在使用 Spring 的过程中,开发者通常会使用 ApplicationContext 作为主要的建造者角色,通过配置和调用它提供的方法来创建和管理各种类型的 Bean。开发者可以使用 BeanDefinitionBuilder 构建 Bean 定义,并将其注册到 ApplicationContext 中,以实现对 Bean 的自定义配置和构建过程。

总结起来,Spring 在 Bean 的创建和配置过程中使用了建造者模式,通过 ApplicationContext、BeanDefinitionBuilder、BeanFactory 和 XML 配置文件等组件来实现对 Bean 的构建和配置。使用建造者模式可以简化 Bean 的创建和配置过程,提高灵活性和可维护性。

建造者模式的优缺点

优点

  • 分离构建过程和表示,使得相同的构建过程可以创建不同的表示。
  • 提供灵活的配置选项,客户端可以根据需求自由选择建造者和创建的步骤。
  • 允许改变产品的内部表示,对客户端代码透明。

缺点

  1. 增加了代码量:建造者模式需要创建具体建造者类、指挥者类等额外的类,从而增加了代码量。每个产品的构建过程可能不同,因此可能需要创建多个具体建造者类。虽然这些额外的类增加了一定的开销,但可以提高代码的可维护性和灵活性。

  2. 组装顺序需要开发者控制:在建造者模式中,开发者需要控制对象构建过程的组装顺序。如果组装顺序不正确,可能导致产品组装错误或缺失某些部分。因此,开发者需要仔细设计和控制组装顺序,增加了设计的复杂性。

简单总结

建造者模式通过将对象的构建过程封装起来,使得建造过程和表示分离,并提供灵活的配置选项。通过抽象建造者、具体建造者和指挥者的协作,客户端可以获得不同的产品表示。然而,建造者模式增加了代码量,并对构建顺序有一定要求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是Flex容器和Flex项目(Flex Container and Flex Item)?它们之间有什么关系?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Flex容器和Flex项目⭐ Flex容器⭐ Flex项目⭐ 关系⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为…

【Mycat 2】详解分库分表设计方案及实操测试(二)

文章目录 4. 分表、不分实例、不分库4.1 数据分片映射关系4.2 测试过程5. 分实例、分表、不分库5.1 分库键和分表键相同5.1.1 数据分片映射关系5.1.2 测试过程5.2 分库键和分表键不相同5.2.1 数据分片映射关系5.2.2 测试过程6. 不分片6.1 普通表6.1.1 数据映射关系6.1.2 测试过…

【用unity实现100个游戏之7】从零开始制作一个仿杀戮尖塔卡牌回合制游戏

文章目录 前言素材资源开始一、UI框架二、挂载脚本三、事件监听,用于绑定按钮事件四、声音管理器五、excel转txt文本六、游戏配置七、用户信息表八、战斗管理器九、 敌人管理器十、玩家血量、能量、防御值、卡牌数十一、敌人血量 行动显示逻辑十二、UI提示效果实现十…

element-ui分析

目录解析 element ├── github // 存放了elementui贡献指南,issue 和 PR模板 ├── build // 存放打包相关的配置文件 ├── examples // 组件相关示例demo ├── packages // 组件源码 ├── src // 存放入口文件和一些工具辅助函数 ├── test // 单元测试…

【Go 基础篇】Go语言结构体详解:打开自定义类型的大门

嗨,Go语言学习者们!在编程的世界里,数据是核心,而结构体(Struct)是一种能够帮助我们更有组织地存储和操作数据的重要工具。在本篇博客中,我们将深入探讨Go语言中结构体的概念、定义、初始化、嵌…

Docker修改容器ulimit的全部方案及各方案的详细步骤

要修改Docker容器的ulimit(用户资源限制),有以下三种方案,每个方案的详细步骤如下: 方案一:在Dockerfile中设置ulimit 打开您的Dockerfile。在文件中添加以下命令来修改ulimit:RUN ulimit -n …

Go的基础运行方式和打包

目录 基础运行方式导入路径 打包技巧相关知识点 基础运行方式 // 文件名可以不是main,但包名和入口函数比如是main // main.go package main // 导入包的时候可以直接导入,也可以导入后指定包名, import ("fmt"godemo "githu…

Tauri打包windows应用配置中文界面

使用 Tauri Rust 开发桌面应用,在 windows 系统上,打包后安装包名称后缀、安装界面、相关说明默认都是英文的。如果要默认显示为中文,则需要在 tauri.conf.json 中配置相应参数。 前言 默认情况下,在 windows 系统打完的 mis 包…

低代码的探索之路

Gartner发布报告指出,2023年全球低代码开发平台市场规模将达到345亿美元,比2022年增长20%。 目前,国内外已经有许多低代码平台,包括OutSystems、Mendix、Appian、Microsoft Power App等。这些平台提供了丰富的功能和工具&#xff…

无涯教程-JavaScript - PERCENTILE函数

PERCENTILE函数替代Excel 2010中的PERCENTILE.INC函数。 描述 该函数返回范围中值的第k个百分位数。您可以使用此功能建立接受阈值。 语法 PERCENTILE (array,k)争论 Argument描述Required/OptionalArrayThe array or range of data that defines relative standing.Requi…

如何使用C++11原子操作实现自旋锁

什么是自旋锁? C自旋锁是一种低层次的同步原语,用于保护共享资源的访问。自旋锁是一种轻量级的锁,适用于短时间的资源锁定。 自旋锁的特点:当一个线程尝试获取已经被另一个线程占有的自旋锁时,这个线程会进入一个循环…

【前端入门案例1】HTML + CSS

案例一 <!DOCTYPE html> <html lang"en-US"><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width"><title>My test page</title> </head><body><…

图:有向无环图(DAG)

1.有向无环图的定义 有向无环图:若一个有向图中不存在环&#xff0c;则称为有向无环图。 简称DAG图(Directed Acyclic Graph) 顶点中不可能出现重复的操作数。 2.有向无环图的应用 1.描述算数表达式 用有向无环图描述算术表达式。 解题步骤&#xff1a; 把各个操作数不重…

springboot web开发整合Freemarker 模板引擎

目录 Freemarker添加依赖配置文件ymlcontrollerhtml Freemarker 简介&#xff1a; FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具…

详解 Vue 3 使用了 Proxy 对象来替代 Vue 2 中的 Object.defineProperty

在 Vue 2 中&#xff0c;响应式系统使用了 Object.defineProperty 来实现属性的劫持和监听。这种方式需要在对象上定义 getter 和 setter&#xff0c;以便在属性被访问或修改时触发相应的操作。 然而&#xff0c;Object.defineProperty 有一些限制和性能问题。它只能劫持对象的…

mysql‘逻辑删除‘和‘唯一索引‘冲突的解决方案

一、冲突出现原因 在user表中将name字段设置唯一索引&#xff0c;添加逻辑删除字段del_flag&#xff08;1为删除&#xff0c;0为未删除&#xff09;之后&#xff0c;将name张四的字段删除&#xff0c;再添加一个name张四的记录则会出现冲突 二、解决 1.设置唯一索引组&#x…

【深度学习】ChatGPT

本文基于Andrej Karpathy(OpenAI 联合创始人&#xff0c;曾担任特斯拉的人工智能和自动驾驶视觉主管)在Microsoft Build 2023上的演讲整理而成&#xff08;完整的视频在文末&#xff0c;直接拖到文章底部&#xff09;&#xff0c;主要分为2大部分&#xff1a; 1.如何训练GPT(可…

前后端项目部署上线详细笔记

部署 参考文章&#xff1a;如何部署网站&#xff1f;来比比谁的方法多 - 哔哩哔哩大家好&#xff0c;我是鱼皮&#xff0c;不知道朋友们有没有试着部署过自己开发的网站呢&#xff1f;其实部署网站非常简单&#xff0c;而且有非常多的花样。这篇文章就给大家分享几种主流的前端…

六、Kafka-Eagle监控

目录 6.1 MySQL 环境准备6.2 Kafka 环境准备6.3 Kafka-Eagle 安装 6.1 MySQL 环境准备 Kafka-Eagle 的安装依赖于 MySQL&#xff0c;MySQL 主要用来存储可视化展示的数据 6.2 Kafka 环境准备 修改/opt/module/kafka/bin/kafka-server-start.sh 命令 vim bin/kafka-server-sta…

VBA_MF系列技术资料1-172

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…