设计模式——建造者模式

news2024/11/23 4:05:06

文章目录

  • 模式理解
  • 基本概念
  • 使用示例
  • 建造者模式延展

模式理解

建造者模式(Builder Pattern):建造者模式是一种对象创建型模式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这句话理解起来太抽象了,现在结合工厂模式来理解建造者模式。

在工厂方式模式中,主要概念有工厂类(包含抽象工厂类及其子类)和产品类(包含抽象产品类及其子类)。一个具体工厂子类生产一个具体产品子类对象,工厂类在创建产品类对象的同时,获取需要初始化的对象属性并进行赋值,也就是在实例化对象时可以获取全部属性信息,工厂类一次性创建好产品类对象及内部属性。

在建造者模式中,在实例化产品类的对象时,并不一定拥有该实例化对象的全部属性信息。也就是对象创建与属性赋值分开,可以先将对象创建出来,然后逐步构建对象属性信息。建造者模式的主要意图是将类的构建逻辑转移到类的实例化之外,通常被用于需要多个步骤创建复杂对象的场景中。建造者模式关注每一个零部件的创建和组装过程,能够更细粒度的控制对象的创建过程和内部结构。

对象的构建与它的表示分离这句话的理解总结:对象的构建就是构建对象内部属性,表示就是对象,先简单实例化对象,后续详细构建对象内部属性,这就是建造者模式。而工厂模式就是一次性不分开的实例化对象和构建内部属性。

基本概念

在建造者设计模式中,有以下几个角色:

  1. 产品角色(Product):表示包含多个组成部件的复杂对象。由具体建造者来创建其各个部件。

  2. 抽象建造者(builder):一个抽象类或接口,包含创建产品各个部件的抽象方法,通常还包含一个返回复杂产品的方法。

  3. 具体建造者(ConcreteBuilder):实现 Builder 的接口,是构造和装配产品各个部件的具体实现。

  4. 指挥者(Director):调用建造者对象中的方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。对于客户来说,只需知道指挥者就可以了,就能构造复杂的对象,而不需要知道具体的构造过程。

    在这里插入图片描述

使用示例

  1. Product 产品类。包含多个组成部件复杂对象。

    public class CarProduct {
    	// 组成部件
        private String wheel;
        private String engine;
        private String chassis;
        // get和set方法........
    }
    
  2. Builder 抽象建造者,规范构造产品的方法。

    public interface CarBuilder {
        // 部件构建
        public abstract void buildWheel(String wheel);
        public abstract void buildEngine(String engine);
        public abstract void buildChassis(String chassis);
        // 返回产品
        public abstract CarProduct getCar();
    }
    
  3. ConcreteBuilder 具体建造者,具体实现 Builder 定义的方法。

    public class WCarConcreteBuilder implements CarBuilder{
    	// 创建对象
        CarProduct carProduct = new CarProduct();
        @Override
        public void buildWheel(String wheel) {
            carProduct.setWheel(wheel);
        }
        @Override
        public void buildEngine(String engine) {
            carProduct.setEngine(engine);
        }
        @Override
        public void buildChassis(String chassis) {
            carProduct.setChassis(chassis);
        }
        @Override
        public CarProduct getCar() {
            return carProduct;
        }
    }
    
  4. Director 指挥者,调用建造者方法顺序实施构造。

    public class Director {
        private CarBuilder builder;
        public Director(CarBuilder builder){
            this.builder = builder;
        }
        public CarProduct createCar(){
            // 指挥建造者构建部件以及组装顺序
            this.builder.buildChassis("先建地盘");
            this.builder.buildWheel("再装轮子");
            this.builder.buildEngine("最后装引擎");
            return this.builder.getCar();
        }
    }
    
  5. 客户类使用指挥者获取对象

    public class Client {
        public static void main(String[] args) {
            Director director = new Director(new WCarConcreteBuilder());
            CarProduct car = director.createCar();
            System.out.println(car);
        }
    }
    

建造者模式延展

如果系统中只需要一个具体建造者的话,可以省略掉抽象建造者,同时还可以省略指挥者,让具体建造者同时扮演建造者和指挥者。

  1. 省略抽象建造者和指挥者,具体建造者同时肩负建造者和指挥者的重任。

    public class WCarConcreteBuilder{
    
        CarProduct carProduct = new CarProduct();
    
        public void buildWheel(String wheel) {
            carProduct.setWheel(wheel);
        }
        public void buildEngine(String engine) {
            carProduct.setEngine(engine);
        }
        public void buildChassis(String chassis) {
            carProduct.setChassis(chassis);
        }
        public CarProduct getCar() {
            return carProduct;
        }
    	// 指挥建造对象
        public void createCar(){
            // 指挥建造者构建部件以及组装顺序
            buildChassis("先建地盘");
            buildWheel("再装轮子");
            buildEngine("最后装引擎");
        }
    }
    
  2. 客户端直接调用具体建造者获取对象。

    public class Client {
        public static void main(String[] args) {
            WCarConcreteBuilder wCarConcreteBuilder = new WCarConcreteBuilder();
            wCarConcreteBuilder.createCar();
            CarProduct car = wCarConcreteBuilder.getCar();
            System.out.println(car);
        }
    }
    

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

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

相关文章

B. Dima and a Bad XOR(构造 + 异或性质)

Problem - 1151B - Codeforces 来自Kremland的学生Dima有一个大小为nm的非负整数矩阵a。 他希望从矩阵的每一行中选择一个整数,以便所选整数的按位互斥或严格大于0。帮助他! 形式上,他想选择一个整数序列c1,c2,…,cn(1≤cj≤m)&am…

Integer包装类详解(java)

文章目录📖前言:🎀包装类概念:🎀包装类分类:🎀包装类integer介绍:🎇自动装箱和自动拆箱问题【⚠注意面试常考点】🎇Integer常用方法:&#x1f4d6…

2023真无线蓝牙耳机推荐:高性价比真无线蓝牙耳机各价位蓝牙耳机推荐!

2023年了,蓝牙耳机赛道依然很卷!性价比是反映物品可买程度的一种量化的计量方式。现如今,蓝牙耳机市场上主打高性价比的不在少数,而高性价比的东西往往更能精准抓住用户“痛点”,从而受到了不少用户的欢迎。 既然高性…

面试20分钟就完事了,问的实在是太......

干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…

Spring Boot整合Junit

系列文章目录 Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客 Spring Boot读取配置文件内容的三种方式_心态还需努力呀的博客-CSDN博客 该系列文章持续更新中~ 目录 系列文章目录 前言 一、搭建SpringBoot工程 二、引入starter-test起步依赖 三、编…

2022年全国研究生数学建模竞赛华为杯F题COVID-19疫情期间生活物资的科学管理问题求解全过程文档及程序

2022年全国研究生数学建模竞赛华为杯 F题 COVID-19疫情期间生活物资的科学管理问题 原题再现: 一、背景介绍   进入2022年以来全国范围内陆续出现了多次较大规模疫情爆发事件[1-2]。在大规模疫情爆发期间由于我国采用封闭式管理方式来实现疫情的快速清零&#x…

Vue组件之间的通信(组件之间的数据传递)

一、Vue组件之间的关系 父子关系:A组件和B组件、B组件和C组件、B组件和D组件​ 兄弟关系:C组件和D组件​ 隔代关系:A组件和C组件、A组件和D组件 二、父组件向子组件传递数据 通过props方式向子组件传递数据(在子组件中添加props属…

为什么选型低代码平台时,需要注重私有化部署能力?

编者按:低代码平台,目前分为私有化部署和公有化部署,企业为什么倾向于选择私有化部署的低代码平台?本文从私有化部署的概念出发,分析了私有化部署的优势,并进一步介绍了支持私有化部署的老牌低代码平台。关…

工控安全-使用Metasploit攻击Modbus设备

文章目录实验内容环境介绍实验开始开启Modbus从站主机和从站服务利用Metasploit工具扫描Modbus从站中的ID访问从站2的寄存器数据修改从站4线圈值可选择的action实验内容 利用Metasploit工具针对Modbus协议进行攻击,读取Modbus从站寄存器数值以及修改Modbus从站寄存…

应届生学习Java八个月,offer年薪28W,这一年我经历了什么?

自我介绍 首页和大家介绍一下我,我叫 阿杆(笔名及游戏名🤣),19级本科在读,双非院校,主修软件工程,学习方向是后端开发,主要语言Java、Python,今年秋招拿到了…

三、Gtk4-Widgets(1)

1 GtkLavel&#xff0c;GtkButton and GtkBox 1.1 GtkLabel 在前一节中&#xff0c;我们创建了一个窗口并将其显示在屏幕上。现在我们进入下一个主题&#xff0c;在这个窗口中添加部件。最简单的部件是GtkLabel。它是一个包含文本的部件。 1 #include <gtk/gtk.h>2 3 s…

spark sql 执行流程

最近学习了spark sql执行流程&#xff0c;从网上搜到了大都是sql解析、analyzer、optimizer阶段、sparkplan阶段&#xff0c;但是我比较好奇的是&#xff0c;这几个阶段是怎么串起来的&#xff0c;于是花了好几天着重从源码层面看看了看具体实现&#xff0c;写了几点自己认为应…

聊聊Mybatis的缓存

Mybatis缓存是内存中的数据&#xff0c;主要是对数据库查询结果的保存&#xff0c;使用缓存的好处是避免频繁与数据库进行交互&#xff0c;提升查询的响应速度。 数据库缓存扩展 聊到Mybatis缓存。我们可以扩展聊一下MySQL缓存。MySQL缓存其实与Mybatis类似&#xff0c;在查询…

物联网架构实例—Ubuntu 安装MongoDB及完全卸载

1.安装1.1.导入公钥wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -如果收到指示gnupg未安装的错误&#xff0c;则可以先执行&#xff1a;sudo apt-get install gnupg然后再执行一次导入公钥命令&#xff1a;wget -qO - https://www.mongo…

React(coderwhy)- 08(Hooks)

认识和体验Hooks 为什么需要Hook? ◼ Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下使用state以及其他的React特性&#xff08;比如生命周期&#xff09;。 ◼ 我们先来思考一下class组件相对于函数式组件有什么优势&#xff1f;比较常见的是下…

Exynos_4412——IIC总线概述

目录 一、IIC总线概述 1.1IIC总线简介 1.2IIC总线通信过程 1.3IIC总线寻址方式 二、IIC总线信号实现 2.1起始信号与停止信号 2.2字节传送与应答 2.3同步信号 三、典型IIC时序 四、小作业 一、IIC总线概述 1.1IIC总线简介 IIC总线IIC总线是Philips公司在八十年代初推…

[VP]河南第十三届ICPC大学生程序竞赛 L.手动计算

前言 传送门 : 题意 : 给定两个椭圆 的方程 , 要求 求出椭圆并集的面积之和 思路 : 本题很显然是积分 或者 计算几何的问题 对于积分的做法, 无非就是根据积分公式求出第一象限的面积 之后拓展到后面四个象限。(奈何我懒, 连两个椭圆的焦点都不想求更别提后面的积分公式了)…

Git遇到冲突?解决也太简单了

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store git冲突是开发过程中很难避免的&#xff0c;对很多git初学者来说也是比较有障碍和门槛的一部分知识。 我认为要想彻底理解一个问题&#xff0c;首先要清楚这个问题是怎么产生的&#xff0c;然后才可以…

大数据NiFi(八):NiFi集群页面的组件工具栏介绍

NiFi集群页面的组件工具栏介绍 一、处理器(Processor)

WebLogic-执行队列

一&#xff0c;Tuning the Application Server 二&#xff0c;执行队列 Using Work Managers to Optimize Scheduled WorkThis chapter describes how WebLogic Server 12.1.3 lets you configure how your application prioritizes the execution of its work using a Work Ma…