建造者模式

news2024/11/25 14:28:52

文章目录

      • 定义
      • 优点
      • 使用场景
      • 代码实现

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
4个角色:

  • Product产品类:通常是实现了模板方法模式,也就是有模板方法和基本方法
  • Builder抽象建造者:规范产品的组件,一般是由子类实现。
  • ConcreteBuilder具体建造者:实现抽象类定义的所有方法,并且返回一个组件好的对象。
  • Director导演类:负责安排已有模块的顺序,然后告诉Builder开始建造

优点

  • 封装性:使用建造者模式可以使客户端不必知道产品内部组成的细节
  • 建造者独立,容易扩展
  • 便于控制细节风险

使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能
  • 在创建对象过程中会使用到系统中的其他一些对象,这些对象在产品对象创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。

注意事项: 建造者模式光关注的时零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同地方。

代码实现

建造者模式

package com.lidaxia.design.pattern.creational.builder;

/**
 * @author lidaxia
 * @version 1.0
 * @date 2022/11/29 21:04
 */
public class Product {

    public void doSomething() {
        /**
         * 独立业务处理
         */
    }

}

package com.lidaxia.design.pattern.creational.builder;

/**
 * @author lidaxia
 * @version 1.0
 * @date 2022/11/29 21:05
 */
public abstract class Builder {

    /**
     * 设置产品的不同部分,以获得不同的产品
     */
    public abstract void setPart();

    /**
     * 建造产品
     *
     * @return
     */
    public abstract Product buildProduct();

}

package com.lidaxia.design.pattern.creational.builder;

/**
 * @author lidaxia
 * @version 1.0
 * @date 2022/11/29 21:07
 */
public class ConcreteProduct extends Builder{

    private Product product = new Product();

    @Override
    public void setPart() {
        /**
         * 产品类内的逻辑处理
         */
    }

    @Override
    public Product buildProduct() {
        /**
         * 组件一个产品
         */
        return product;
    }
}

package com.lidaxia.design.pattern.creational.builder;

/**
 * @author lidaxia
 * @version 1.0
 * @date 2022/11/29 21:09
 */
public class Director {

    private Builder builder = new ConcreteProduct();

    /**
     * 构建不同的产品
     *
     * @return
     */
    public Product getProduct() {
        builder.setPart();
        /**
         * 设置不同的零件,产生不同的产品
         */
        return builder.buildProduct();
    }

}

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

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

相关文章

PyQt5可视化编程-事件、信号和对话框

一、概述: 所有的应用都是事件驱动的。事件大部分都是由用户的行为产生的,当然也有其他的事件产生方式,比如网络的连接,窗口管理器或者定时器等。调用应用的exec_()方法时,应用会进入主循环,主循环会监听和分发事件。…

算法题:整数除法

一.题目描述以及来源 给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 *、除号 / 以及求余符号 % 。 注意: 整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345…

MP157-2-TF-A移植:

MP157-2-TF-A移植:1. TF-A移植:1.1 新建开发板的设备树1.2 修改设备树电源管理1.3修改TF卡和EMMC设备树1.4 修改USBOTG设备树2 编译测试2.1 Makefile.sdk 修改内容:2.2 编译命令:正点原子第九章内容:自己记的笔记&…

SpringBoot(One·上)

SpringBoot一、简介概述Spring Boot特性SpringBoot四大核心二、SpringBoot项目分析1、创建第一个案例结构目录和pom文件2、Springboot集成mvcSpringboot核心配置文件application.propertiesSpringboot核心配置文件application.yml或者application.yamlapplication.ymlapplicati…

Allegro削铜皮详细操作指导

Allegro削铜皮详细操作指导 Allegro可以编辑任意形状的铜皮,下面介绍几种削铜皮的方式 任意形状,shape-manual Void/cavity-Polygon 鼠标左键点击铜皮,铜皮会被亮起来 画出需要的形状 完成后如下图 方形shape-manual Void/cavity-Rectangular 同样的选择铜皮,画出需要…

通过 js 给元素添加动画样式animation属性 ,以及 perspective 属性探究

学习关键语句: js添加动画效果 js控制元素animation属性 写在前面 在制作组件的过程中呢 , 突然觉得这个动画啊应该由用户来决定到底是个啥样 , 但是怎么让用户操作这一步呢 ? 总不能让用户自己去写 css keyframe 吧 , 所以便有了这篇文章 , 同时 , 这篇文章的下半部分我们会…

Python+Selenium:Google patent数据爬取

准备工作,已搭建Python环境,安装Selenium pip install selenium -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 步骤1: 根据Chrome版本下载ChromeDriver 下载链接地址: ChromeDriver - WebDriver for Chrome - Downloads 如在帮助——>关于Ch…

车道线检测-lanedet

源码:https://github.com/Turoad/lanedet 这是一个常见的检测网络整合版本,目前包括的检测网络有: 模型论文介绍 SCNN,RESA论文介绍,UFLD介绍,laneNet|其它相关模型,LaneATT介绍 数据集介绍…

机器学习之归一化

机器学习之归一化1.目的1.1损失函数求解问题1.2 归一化目的2. 归一化2.1 最大值最小值归一化2.2 标准化1.目的 1.1损失函数求解问题 线性回归Loss函数梯度公式 参数含义θ\thetaθ函数参数α\alphaα学习率xjix^i_{j}xji​x:数据集,i:样本,j:特征 【数…

OPengl学习(二)——opengl环境搭建

文章目录0、 概念/准备1、VSOpengl快速添加手动编译2、QT中使用opengl1.pro配置文件2.引入头文件 继承QGLWidget3.实现三个主要函数3、引用0、 概念/准备 opengl官网地址 1、OpenGL 函数库相关的 API 有核心库(gl),实用库(glu&a…

自动化状态监测和工业4.0解决方案-Softing uaGate SI

某公司为其注塑和反应/挤出系统采用了uaGate SI网关技术并实行了开放且独立于平台的OPC UA标准,以用于设备状态自动化监控,这有助于提高产量并避免机器停机。 自动化状态监测提高了产量并且可避免机器停机。为了将其设备控制系统与IT系统相连接起来&…

最小生成树(Prim算法与Kruskal算法)

一、什么是最小生成树 一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树称为最小生成树。 例如下图中①、②、③都是左侧图的生成树,但③是构…

k8s的亲和调度

k8s的亲和调度 出于高效通信等需求,偶尔需要把一些Pod对象组织在相近的位置(同一节点、机架、区域或地区等),例如应用程序的Pod及其后端提供数据服务的Pod等,我们可以认为这是一类具有亲和关系的Pod对象。 理想的实现方式是允许调度器把第一个…

[附源码]计算机毕业设计springboot高校流浪动物领养网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

2022.11.28总结

今天写了条件查询 虽然思路上还说是比较顺,但是还是写了一晚上,因为老是在细节上出现bug,改了好久,踩了好几个坑。 首先大概是因为组件不是确定的,我把ref属性绑定在router-view上,导致我获取不到条件选择…

c++类型转换

目录 1.隐式类型转换和强制类型转换 2.隐式类型转换带来的危险 3.c提供的标准类型转换关键字 4.总结 1.隐式类型转换和强制类型转换 c语言的类型转换可以分为隐式类型转换和强制类型转换。 #include<iostream>using namespace std;int main() {double a 3.14;int …

医疗保健行业的福音是对话式AI吗?

导读对话式AI可以对医疗保健行业产生重大影响&#xff0c;且在许多领域已经产生了影响。如果使用得当&#xff0c;对话式AI可以提高操作效率和临床结果&#xff0c;并减轻医护人员的工作量。 对话式AI技术开启了数字患者护理的新时代。 患者可以随时访问其需要的数据&#xff…

Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10

Xshell远程连接进行Ubuntu的Pytorch配置写在最前面参考Xshell常用命令Ubantu检查系统的各项配置查看ubuntu系统的版本信息和gcc版本查看Linux的内核版本和系统是多少位的验证机器是否具有n卡各种配置&#xff08;建议不要省略&#xff09;安装vim增加pip镜像源禁用nouveau开启S…

[附源码]计算机毕业设计springboot高校学生摄影作品展示平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

app与小程序的区别【开发小程序】

app与小程序&#xff0c;两者有什么区别呢&#xff1f;很多公司在开发app或是开发小程序上比较纠结&#xff0c;二选一不止究竟选哪个好&#xff0c;当然有财力的公司可能会两者都开发。那么下面说说app与小程序的区别是什么&#xff0c;好让大家更好地二选一。 app与小程序的…