设计模式(二)-创建者模式(5)-建造者模式

一、为何需要建造者模式(Builder)?

在软件系统中,会存在一个复杂的对象,复杂在于该对象包含了很多不同的功能模块。该对象里的各个部分都是按照一定的算法组合起来的。
为了要使得复杂对象里的各个部分的独立性,以及将它们组合在一起的算法需要保持固定(不会轻易改变其算法逻辑),不会随着新需求改变从而改变原有的逻辑。此时就需要用建造者模式了。

特点:
将一个复杂对象的构建和其各个部分之间分离,在同一个算法组合里可以创建出不同的对象。

  • 部件的算法组合、对象的构建、部件的实现之间进行分离。

结构

  • 产品类(Product):存在产品的所有部件属性,需要用来创建的复杂对象。
  • 建造创建者类(Builder):抽象类,定义复杂对象的部件创建的规范(抽象方法)。
  • 具体创建类(ConCreateBuilder):实现 Builder 接口方法,完成具体产品的创建。
  • 指挥者类(Director):由指挥者类来调用具体创建者类的方法按照一定的顺序来组装,返回完整的对象产品。

适合应用场景的特点:

  • 产品类里具有不同型号产品的共同属性。(如下文例子中的渐变颜色,形状)
  • 部件的型号不同,创建的逻辑也很可能不相同。(如有不同的代码逻辑来创建形状Point)
  • 部件的组合方式是固定的。(如设置渐变颜色和形状的组合算法是固定的)
    请添加图片描述

二、例子

需求:

实现一个画图程序。根据不同形状和不同渐变颜色来创建一个图形。比如,创建一个红橙按比例 50:100 渐变的矩形;创建一个白灰黑按比例 50:70:100 渐变的三角形。(为了方便理解,下面例子不写得过于复杂,就不使用 Graphics 和 Pen 的复杂方式绘图,而使用 Point 数组进行简单绘图)

1、产品:

    //产品类里具有不同型号产品的共同属性。public sealed class Sharp{public Point[] point { get; private set; }public List<Colors> colors { get; private set; }public void setPoint(Point[] p) { point = p; }public void setColors(List<Colors> colors) { this.colors = colors; }}//Sharp 属性:形状public struct Point{public double x;public double y;}//Sharp 属性:渐变颜色public class Colors{public string Rgb { get; set; }public double GradientValue { get; set; }public Colors(string rgb,double gradient){Rgb = rgb;GradientValue = gradient;}}

2、抽象建造者:


public abstract class Builder{protected Sharp Sharp { get; set; }public Builder(){Sharp = new Sharp();}public Sharp GetSharp(){return Sharp;}//部件的组合方式是固定的public abstract void BuilderSharp();public abstract void BuilderColors();}

3、构造建造者(具体创建者):


//矩形构造者public class RectSharpBuilder : Builder{//部件的型号不同,创建的逻辑也很可能不相同。同下public override void BuilderSharp(){Point[] point = new Point[4];point[0].x = 0; point[0].y = 0;point[1].x = 0; point[1].y = 10;point[2].x = 10; point[2].y = 0;point[3].x = 10; point[3].y = 10;Sharp.setPoint(point);}public override void BuilderColors(){List<Colors> colors = new List<Colors>(){new Colors("Red",50),new Colors("Orange",100)};Sharp.setColors(colors);}}//三角形构造者public class TriangleSharpBuilder : Builder{public override void BuilderSharp(){Point[] point = new Point[3];point[0].x = 0; point[0].y = 10;point[1].x = 5; point[1].y = 0;point[2].x = 10; point[2].y = 10;Sharp.setPoint(point);}public override void BuilderColors(){List<Colors> colors = new List<Colors>(){new Colors("White",50),new Colors("Gray",70),new Colors("Black",100)};Sharp.setColors(colors);}}

4、指导者:


public class Director{   //部件的组合方式是固定的public Sharp BuildSharp(Builder builder){builder.BuilderSharp();builder.BuilderColors();return builder.GetSharp();}}

5、主程序:


class Program{static void Main(string[] args){Director director = new Director();Builder RectSharp = new RectSharpBuilder();Builder TriangleSharp = new TriangleSharpBuilder();director.BuildSharp(RectSharp);director.BuildSharp(TriangleSharp);Console.ReadLine();}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型学习之GPT系列

GPT系列 预备知识GPT-1无监督预训练有监督的微调训练 GPT-2数据集&#xff1a;输入表示模型实验 GPT-3模型数据集实验局限性 InstructGPTGPT-4GPT-4 新特性基础能力 参考文献 大模型 GPT演进路线图 预备知识 Transformer 结构图 GPT-1 首先使用未标注的数据训练一个预训练…

速学数据结构 | 树 森林 二叉树 的概念详讲篇

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;hello&#xff01; 各位宝子们大家好啊&#xff0c;关于线性表我们已经在前面更新完了…

c YUV 转 JPEG(准备霍夫曼编码)

先取yuv 文件中一个168的块&#xff0c;跑通全流程 理解与思路&#xff1a; 1.块分割 YUV 文件分为&#xff1a;YUV444 YUV 422 YUV420。444:就是&#xff1a;12个char 有4个Y&#xff0c;4个U&#xff0c;4个 U&#xff0c;422&#xff1a;8个char 中有4个Y &#x…

西科大微机原理实验四(定时器程序设计)

任务一、 按实验要求内容新建一个ASM41.ASM文件,使用masm命令生成obj文件并输入 上述源程序中使用了外部资源,该外部资源存在于文件 LIB_TIM.OBJ中,因此使用link命令将 ASM41.OBJ 和 LIB_TIM.OBJ 一起链接生成可执行文件 使用debug加载程序并进行调试 使用-g指令,回显如下…

技术分享 | 想做App测试就一定要了解的App结构

app 的结构包含了 APK 结构和 app 页面结构两个部分 APK结构 APK 是 Android Package 的缩写&#xff0c;其实就是 Android 的安装包。通过将 APK 文件直接传到 Android 模拟器或 Android 手机中执行即可安装。 APK 文件其实是 zip 格式&#xff0c;但后缀名被修改为 apk&…

Mysql进阶-InnoDB引擎事务原理及MVCC

事务原理 事务基础 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 事务的四大特性&#xff1a; 原子性&#xff08;A…

抖去推--短视频剪辑、矩阵无人直播saas营销工具一站式开发

抖去推是一款短视频剪辑和矩阵无人直播SAAS营销工具一站式开发平台。它提供了以下功能和特点&#xff1a; 1. 短视频剪辑&#xff1a;抖去推提供了一系列的剪辑工具&#xff0c;包括自动剪辑、特效制作、配音配乐等&#xff0c;可以帮助用户轻松制作出高质量的短视频。 2. 矩阵…

Java实现一个简单的贪吃蛇小游戏

一. 准备工作 首先获取贪吃蛇小游戏所需要的头部、身体、食物以及贪吃蛇标题等图片。 然后&#xff0c;创建贪吃蛇游戏的Java项目命名为snake_game&#xff0c;并在这个项目里创建一个文件夹命名为images&#xff0c;将图片素材导入文件夹。 再在src文件下创建两个包&#xff0…

阿里云SLB的使用总结

一、什么是SLB 实现k8s的服务service的一种推荐方式&#xff0c;也是服务上云后&#xff0c;替代LVS的一个必选产品。 那么它有什么作用呢&#xff1f; 1、负载均衡&#xff0c;是它与生俱来的。可以配置多个服务器组&#xff1a;包括虚拟服务器组、默认服务器组、主备服务器…

鸿蒙原生应用/元服务开发-Stage模型能力接口(二)

ohos.app.ability.AbilityConstant (AbilityConstant)一、说明 AbilityConstant提供Ability相关的枚举&#xff0c;包括设置初次启动原因、上次退出原因、迁移结果、窗口类型等。本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口…

python读取csv文件

在Python中&#xff0c;你可以使用pandas库来读取CSV文件。以下是一个基本的例子&#xff1a; import pandas as pd# 读取CSV文件data pd.read_csv(filename.csv)# 显示前几行数据print(data.head()) 这里&#xff0c;filename.csv应该被替换为你的CSV文件的实际路径和名称。…

多合一iPhone 解锁工具:iMyFone LockWiper iOS

多合一iPhone 解锁工具 无需密码解锁 iPhone/iPad/iPod touch 上所有类型的屏幕锁定 在几分钟内解锁 iPhone Apple ID、Touch ID 和 Face ID 立即绕过 MDM 并删除 iPhone/iPad/iPod touch 上的 MDM 配置文件 支持所有 iOS 版本和设备&#xff0c;包括最新的 iOS 17 和 iPhone 1…

学生管理系统 数据库版

1.写SQL语句 创建school_java数据库 创建student数据表包含 id、name姓名、tel电话、sex性别字段 往student表中加10条数据 2.写Java代码&#xff08;要求只用PreparedStatement对象&#xff0c;变化的值都用?代替&#xff09; 查询student表中所有学生信息 student表中新增三…

2023年国赛高教杯数学建模A题定日镜场的优化设计解题全过程文档及程序

2023年国赛高教杯数学建模 A题 定日镜场的优化设计 原题再现 构建以新能源为主体的新型电力系统&#xff0c;是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。   定日镜是塔式太阳能光热发电站&#xff08;以下…

Spring Security 6.x 系列(10)—— SecurityConfigurer 配置器及其分支实现源码分析(二)

一、前言 在本系列文章&#xff1a; Spring Security 6.x 系列&#xff08;4&#xff09;—— 基于过滤器链的源码分析&#xff08;一&#xff09; 中着重分析了Spring Security在Spring Boot自动配置、 DefaultSecurityFilterChain和FilterChainProxy 的构造过程。 Spring …

HarmonyOS应用程序框架——UIAbility实操

UIAbility概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。 每一个UIAbility实例&#xff0c;都对应于一个最近任务列表中的任务。 一个应用可以有一个UIAbility&…

定时器TIM HAL库+cubeMX(上)

定时器时钟源APB1 36MHz 一.基本定时器 1.基本框图 2.溢出时间计算 3.配置定时器步骤 TIM_HandleTypeDef g_timx_handle;/* 定时器中断初始化函数 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) {g_timx_handle.Instance TIM6;g_timx_handle.Init.Prescaler p…

【C语言(十三)】

自定义类型&#xff1a;结构体 一、结构体类型的声明 1.1、结构体回顾 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1、结构的声明 例如描述⼀个学生&#xff1a; struct Stu {char name[20];//名字int age;//年龄c…

uniapp点击按钮,防止按钮多次点击多次触发事件【防抖操作】

图片、 一、在根目录下新建common文件并创建common.js文件&#xff0c;输入下面代码 // 防止处理多次点击function noMultipleClicks(methods, info) {// methods是需要点击后需要执行的函数&#xff0c; info是点击需要传的参数let that this;if (that.noClick) {// 第一次点…

【EI会议征稿中】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)

2024年第四届人工智能、自动化与高性能计算国际会议&#xff08;AIAHPC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)将于20…