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

news2024/11/18 9:37:06

文章目录

  • 简介
  • 建造者模式的核心概念
    • 产品(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.coloradmin.cn/o/962664.html

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

相关文章

【类与对象】②认识类的六个默认函数

文章目录 1.类的六个默认函数2.构造函数3.析构函数4.拷贝构造函数5.赋值运算符重载6.const成员 1.类的六个默认函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动…

算法通关村14关 | 数据流中位数问题

1. 数据流中位数问题 题目 LeetCode295: 中位数是有序列表中间的数,如果列表长度是偶数,中位数是中间两个数的平均值, 例如:[2,3,4]的中位数是3, [2,3]中位数是(23)/ 2 2.5 设计一个数据结构: …

使用python对光谱进行lorentz峰值拟合并作图(标注峰值点位)

承接: 使用python对光谱进行lorentz峰值拟合 接下来是对图象的处理,即作图。 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit# 定义Lorentzian函数 def lorentzian(x, x0, A, gamma):return A * gamma**2…

外贸企业如何借助CRM提升企业发展?

外贸企业竞争激烈,提高自身竞争力,扩大海外业务市场,是每个外贸企业的目标。为了实现这一目标,不少外贸企业借助CRM系统,优化业务流程,管理维护客户,从而实现可持续发展。那么,外贸企…

git 忽略已经提交的文件或文件夹 (修改.gitignore文件无效)

场景描述:项目开发到一半,追加了模块,提交的时候未注意将不需要提交的文件或者目录提交到.gitignore,然后提交后发现再修改git配置文件已无法阻拦更新,查阅官方资料: 核心点:.gitignore 之前&a…

大数据之hadoop入门

大数据概念 大数据:无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现李和流程优化能力的海量、高增长率和多样化的信息资产。 大的概念是相对来说的:目前来说&#xff0…

基于51单片机的SHT11温湿度上下限LCD12864显示报警仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机SHT11温湿度上下限LCD12864显示报警仿真设计( proteus仿真程序原理图报告讲解视频) 讲解视频1.主要功能:2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&下载链接 51单片机SHT11温湿度上下限LCD12864显示报警仿真设计( proteus仿…

实现跨境电商测评和采退、LU卡、LU货最安全的系统方案

首先你要有一个稳定的测评环境系统,这个是做自养号退款、撸货、撸卡的基础。测评环境系统有很多,从早期的虚拟机,模拟机,云手机,VPS等等。这些系统方案先不说成本高,最重要的是成功率很低,所以一…

Git和Github的基本用法

目录 背景 下载安装 安装 git for windows 安装 tortoise git 使用 Github 创建项目 注册账号 创建项目 下载项目到本地 Git 操作的三板斧 放入代码 三板斧第一招: git add 三板斧第二招: git commit 三板斧第三招: git push 小结 🎈个人主页&#xf…

基于单片机的串行通信发射机设计

一、项目介绍 串行通信是一种常见的数据传输方式,允许将数据以比特流的形式在发送端和接收端之间传输。当前实现基于STC89C52单片机的串行通信发射机,通过红外发射管和接收头实现自定义协议的数据无线传输。 二、系统设计 2.1 单片机选择 在本设计中&…

黑马 大事件项目 笔记

学习视频:黑马 Vue23 课程 后台数据管理系统 - 项目架构设计 在线演示:https://fe-bigevent-web.itheima.net/login 接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径: http:/…

系统架构技能之设计模式-抽象工厂模式

一、上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式。并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建。 工厂模式&…

系统架构技能之设计模式-工厂模式

一、开篇 本文主要是讲述设计模式中最经典的创建型模式-工厂模式,本文将会从以下几点对工厂模式进行阐述。 本文将会从上面的四个方面进行详细的讲解和说明,当然会的朋友可以之处我的不足之处,不会的朋友也请我们能够相互学习讨论。 二、摘…

学习心得06:Halcon

据说实际场景中,使用Halcon的多。功能上跟OpenCV差不多,轮廓,线条,边缘,连通,滤波,深度学习等。 需要了解的是,如何与其他语言对接。这当然也不难,人家早就考虑好了。 看…

企业架构LNMP学习笔记4

企业服务器LNMP环境搭建: 常见的软件架构: 1)C/S: client/server 2)B/S: browser/server 不管是C还是B,都是属于客户端属于前端。那么运维人员主要是负责和管理的Server端,也统称为服务器端。为了快速的…

[标注工具]rolabelImg旋转框标注工具安装和使用教程

rolabelImg是一个专门用于标注旋转框的工具,目前最新版本是3.0版本,rolabelImg是python编写的,为了避免安装python环境和配置。我们可以直接使用安装包安装,首先我们打开安装包 双击打开安装包 选择安装路径,不要是中文…

Linux-Centos7安装Docker

文章目录 一、前言二、Docker安装1、Docker及系统版本2、Docker的自动化安装3、Docker手动安装3.1、卸载Docker(可选)3.2、设置源仓库3.3、Docker安装3.4、Docker启动3.5、验证是否安装成功3.5.1、拉取镜像3.5.2、查看镜像3.5.3、运行镜像 3.6、删除Dock…

Spring-Cloud-Openfeign如何传递用户信息?

用户信息传递 微服务系统中,前端会携带登录生成的token访问后端接口,请求会首先到达网关,网关一般会做token解析,然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务,微服务中会有拦截器来做用户信息的…

一,表单标签

一,表单标签 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>常用标签</title></head><body><!-- 1.表单标签:比表格多了数据提交的功能1.1, 要求:必须使用form标签 必须有提交按钮 必须配置name属…

springcloud3 注册中心以及cloud启动原理总结(含面试)

一 Springcloud微服务面试题 1.1 为何使用注册中心 1)问题描述 在多个单体微服务之间&#xff0c;可以直接通过http请求进行通信&#xff0c;但是存在以下问题&#xff1a; 1.调用服务提供者时需要写ip和端口&#xff0c;如果出现ip和端口进行了修改&#xff0c;没有及时告…