当前位置: 首页 > news >正文

设计模式02———建造者模式 c#

首先我们打开一个项目

在这个初始界面我们需要做一些准备工作

建基础通用包

创建一个Plane 重置后 缩放100倍 加一个颜色

更换天空盒(个人喜好)

任务:使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】

首先资源商店下载车模型

将Car导入资源拖拽至场景 将导入包放进WBag外包方便整理

将Car完全解压缩 为了取出小车各部分零件 方便我们组装车

拆分第一个组件 车体 命名为CarBody 放进预制体包Prefabs

删除场景中的 CarBody

拆分第二个组件 车座命名为 CarShadle

将剩余物体 设置 成空父物体的子物体 作为一个整体 命名为 CarWheels

准备工作做完后    接下我们做【建造者模式】

建造者模式属于23设计模式中的一种 是一种创建型模式

通常是为了 通过多种组件 由指挥者 拼装出 多种不同所需产品 

建造者模式最低需要四个类就可以完成加上Main类中调用需要五个

首先需要         【产品类】

其实需要         【抽象建造类】

再其次需要     【建造具体类】

再再其次需要 【指挥者类】

最后我们通过Main继承Mono挂载再脚本上调用即可

实现:

1.创建脚本【产品类】:

using UnityEngine;
public class Car{
    public GameObject CarPart {
        get;
        set;
    }
}

2.【抽象建造类】:

public abstract class IBuildCar{
    public abstract void SetCarBody();
    public abstract Car GetCar();
}

3.【建造具体类】:

using UnityEngine;
public class BuildCarA : IBuildCar{
    Car car;
    public BuildCarA(Car car){
        this.car = car;
    }
    public override void SetCarBody(){
        car.CarPart = Resources.Load<GameObject>("Prefabs/CarBody");
        if(car.CarPart != null)
            GameObject.Instantiate(car.CarPart,new Vector3(0,0,0),Quaternion.identity);
    }
    public override Car GetCar(){
        return car;
    }
}

4.【指挥者类】:

public class Director{
    public IBuildCar type;
    public Director(IBuildCar type){
        this.type = type;
    }
    public void GetCarBody() {
        type.SetCarBody();
    }
}

5.【控制挂载类】

using UnityEngine;
public class Main : MonoBehaviour{
    private void Start(){
        Car car = new Car();
        //里氏替换
        IBuildCar type = new BuildCarA(car);
        Director d1 = new Director(type);
        d1.GetCarBody();
    }
}

我们回到unity场景中创建一个空物体改名Obj 重置位置 将Main脚本挂载

运行即可生成

接下来我们利用UI + 事件 控制【建造者模式】

1.【产品类】 不动代码

2.【抽象建造类】        不动代码

3.【建造具体类】        修改代码:

using UnityEngine;
public class BuildCarA : IBuildCar{
    //按钮计数器
    int count = 0;
    Car car;
    public BuildCarA(Car car){
        this.car = car;
    }
    public override void SetCarBody(){
        count++;
        car.CarPart = Resources.Load<GameObject>("Prefabs/CarBody");
        if(car.CarPart != null && count % 2 != 0)
            GameObject.Instantiate(car.CarPart,new Vector3(0,1,0),new Quaternion(0,10,10,0));
    }
    public override Car GetCar(){
        return car;
    }
}
4.【指挥者类】      不动代码

5.【控制挂载类】  修改代码:

using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehaviour{
    //开放Button按钮
    public Button setCarBodyButton;
    //按钮计数器
    int count = 0;
    private void Start(){
        Car car = new Car();
        //里氏替换
        IBuildCar type = new BuildCarA(car);
        Director d1 = new Director(type);
        setCarBodyButton.onClick.AddListener(() => d1.GetCarBody());
    }
    public void DestroyCarBody(){
        if (count % 2 == 0)
            Destroy(GameObject.Find("CarBody(Clone)"));
    }
}
我们回到unity场景中创建button     【做一个折叠按钮】

ctrl + d复制 Button

将未开启的Button 改名为 Close 开启的Button改名为 open

修改Panel尺寸

新建Button 作为 创建车体的按钮 改名为 ButtonA

开启 按钮事件:

将Obj 拖拽至 框选栏 并选择

选择我们脚本代码中自定义的函数

最后将ButtonA 代码 绑定在 Main中

运行

点击ButtonA 按钮

再点消失

关闭选项

 目前已完成

如果想在建造其他组件则需要:

1.【产品类】               不动代码

2.【抽象建造类】        增加代码:

public abstract class IBuildCar{
    public abstract void SetCarBody();
    public abstract void SetCarWheels();
    public abstract Car GetCar();
}
3.【建造具体类】        增加代码:

using UnityEngine;
public class BuildCarA : IBuildCar{
    //按钮计数器
    int count = 0;
    Car car;
    public BuildCarA(Car car){
        this.car = car;
    }
    public override void SetCarBody(){
        count++;
        car.CarPart = Resources.Load<GameObject>("Prefabs/CarBody");
        if(car.CarPart != null && count % 2 != 0)
            GameObject.Instantiate(car.CarPart,new Vector3(-14,1,0),new Quaternion(0,10,10,0));
    }
    public override void SetCarWheels()
    {
        count++;
        car.CarPart = Resources.Load<GameObject>("Prefabs/CarWheels");
        if (car.CarPart != null && count % 2 != 0)
            GameObject.Instantiate(car.CarPart, new Vector3(-14, 0.24f, 25.29f), Quaternion.identity);
    }
    public override Car GetCar(){
        return car;
    }
}

4.【指挥者类】      增加代码:

public class Director{
    public IBuildCar type;
    public Director(IBuildCar type){
        this.type = type;
    }
    public void GetCarBody() {
        type.SetCarBody();
    }
    public void GetCarWheels()
    {
        type.SetCarWheels();
    }
}

5.【控制挂载类】  增加代码:

using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehaviour{
    //开放Button按钮
    public Button setCarBodyButton;
    public Button setCarWheelsButton;
    //按钮计数器
    int count = 0;
    private void Start(){
        Car car = new Car();
        //里氏替换
        IBuildCar type = new BuildCarA(car);
        Director d1 = new Director(type);
        setCarBodyButton.onClick.AddListener(() => d1.GetCarBody());
        setCarWheelsButton.onClick.AddListener(() => d1.GetCarWheels());
    }
    public void DestroyCarBody(){
        if (count % 2 == 0)
            Destroy(GameObject.Find("CarBody(Clone)"));
    }
    public void DestroyCarWheels()
    {
        if (count % 2 == 0)
            Destroy(GameObject.Find("CarWheels(Clone)"));
    }
}
回到unity场景中   重复事件操作即可完成运行

相关文章:

设计模式02———建造者模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒&#xff08;个人喜好&#xff09; 任务&#xff1a;使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…...

2023最新接口自动化测试面试题

1、get和post的区别&#xff1f; l http是上层请求协议&#xff0c;主要定义了服务端和客户端的交互规格&#xff0c;底层都是tcp/ip协议 l Get会把参数附在url之后&#xff0c;用&#xff1f;分割&#xff0c;&连接不同参数&#xff0c;Get获取资源&#xff0c;post会把…...

GaN器件的工作原理

目录 AlGaN/GaNHEMT 器件工作原理&#xff08;常开-耗尽型器件&#xff09;常关 AlGaN/GaN 功率晶体管&#xff08;增强型器件&#xff09;HD-GIT与SP-HEMT AlGaN/GaNHEMT 器件工作原理&#xff08;常开-耗尽型器件&#xff09; 来源&#xff1a;毫米波GaN基功率器件及MMIC电路…...

点云从入门到精通技术详解100篇-海量三维点云的空间索引及可视化应用(续)

目录 3.2.3 方向八叉树与八叉树的比较 3.3 多级索引结构 3.3.1 多级索引结构的构建...

androidx和v4包资源冲突解决方法

一、资源包会报如下错误&#xff1a; 错误类似 (androidx.core:core:1.10.0) 和 (com.android.support:support-compat:24.2.0) 表示资源重复&#xff0c;不知调用androidx包下面的&#xff0c;还是v4包下面的 Duplicate class android.support.v4.app.INotificationSideCha…...

【发烧期间随笔】第一次游戏开发经历的总结与反思

一、前言 这两天三阳了&#xff0c;头疼头晕恶心发烧打喷嚏流鼻涕咳嗽嗓子疼气管疼都找上门来了&#xff0c;这导致一周以来都没学什么东西&#xff0c;无意间又刷到各个游戏厂关于本人目标岗位HC骤减且要求造火箭的能力的消息&#xff0c;这两天一直是在病痛和焦虑中度过的&a…...

CCombBox组合框

1、 MFC_Combo_Box(组合框)的详细用法_mfc combo-CSDN博客 2、 常用属性设置&#xff1a; 属性 含义 data 设置内容&#xff0c;不同内容间用英文的分号“;”分隔 type 显示风格 Sort True 内容自动排序 常用接口&#xff1a; 接口 功能 CComboBox::AddString 组…...

机器学习-有监督学习-神经网络

目录 线性模型分类与回归感知机模型激活函数维度诅咒过拟合和欠拟合正则数据增强数值稳定性神经网络大家族CNNRNNGNN&#xff08;图神经网络&#xff09;GAN 线性模型 向量版本 y ⟨ w , x ⟩ b y \langle w, x \rangle b y⟨w,x⟩b 分类与回归 懂得两者区别激活函数&a…...

React之组件通信

#一、是什么 我们将组件间通信可以拆分为两个词&#xff1a; 组件通信 回顾Vue系列 (opens new window)的文章&#xff0c;组件是vue中最强大的功能之一&#xff0c;同样组件化是React的核心思想 相比vue&#xff0c;React的组件更加灵活和多样&#xff0c;按照不同的方式可…...

什么是微服务架构

阅读“微服务架构”一词可能会让您直观地了解该术语的含义&#xff1a;计算架构中的小型服务。这个定义并不完全错误&#xff0c;但也不完全正确。 微服务架构通常被称为“打破整体”的一种方式。遗憾的是&#xff0c;这与《2001&#xff1a;太空漫游》无关&#xff0c;而是将…...

<%=%>模板写法

<%%> 这种写法通常称为 "内嵌式模板" 或 "模板标记"&#xff0c;在前端开发中&#xff0c;这种标记语法用于将动态数据嵌入HTML模板中。这种写法通常与模板引擎一起使用&#xff0c;这些模板引擎会根据提供的数据动态生成HTML。 不同的模板引擎可能…...

python爬取boss直聘数据(selenium+xpath)

文章目录 一、主要目标二、开发环境三、selenium安装和驱动下载四、主要思路五、代码展示和说明1、导入相关库2、启动浏览器3、搜索框定位创建csv文件招聘页面数据解析(XPATH)总代码效果展示 六、总结 一、主要目标 以boss直聘为目标网站&#xff0c;主要目的是爬取下图中的所…...

GEO生信数据挖掘(六)实践案例——四分类结核病基因数据预处理分析

前面五节&#xff0c;我们使用阿尔兹海默症数据做了一个数据预处理案例&#xff0c;包括如下内容&#xff1a; GEO生信数据挖掘&#xff08;一&#xff09;数据集下载和初步观察 GEO生信数据挖掘&#xff08;二&#xff09;下载基因芯片平台文件及注释 GEO生信数据挖掘&…...

8.Mobilenetv2网络代码实现

代码如下&#xff1a; import math import os import numpy as npimport torch import torch.nn as nn import torch.utils.model_zoo as model_zoo#1.建立带有bn的卷积网络 def conv_bn(inp, oup, stride):return nn.Sequential(nn.Conv2d(inp,oup,3,stride,biasFalse),nn.Bat…...

Spring Boot Controller

刚入门小白&#xff0c;详细请看这篇SpringBoot各种Controller写法_springboot controller-CSDN博客 Spring Boot 提供了Controller和RestController两种注解。 Controller 返回一个string&#xff0c;其内容就是指向的html文件名称。 Controller public class HelloControll…...

在网络安全、爬虫和HTTP协议中的重要性和应用

1. Socks5代理&#xff1a;保障多协议安全传输 Socks5代理是一种功能强大的代理协议&#xff0c;支持多种网络协议&#xff0c;包括HTTP、HTTPS和FTP。相比之下&#xff0c;Socks5代理提供了更高的安全性和功能性&#xff0c;包括&#xff1a; 多协议支持&#xff1a; Socks5代…...

Web测试框架SeleniumBase

首先&#xff0c;SeleniumBase支持 pip安装&#xff1a; > pip install seleniumbase它依赖的库比较多&#xff0c;包括pytest、nose这些第三方单元测试框架&#xff0c;是为更方便的运行测试用例&#xff0c;因为这两个测试框架是支持unittest测试用例的执行的。 Seleniu…...

jvm打破砂锅问到底- 为什么要标记或记录跨代引用

为什么要标记或记录跨代引用. ygc时, 直接把老年代引用的新生代对象(可能是对象区域)记录下来当做根, 这其实就是依据第二假说和第三假说, 强者恒强, 跨代引用少(存在互相引用关系的两个对象&#xff0c;是应该倾 向于同时生存或者同时消亡的). 拿ygc老年代跨代引用对象当做根…...

小程序长期订阅

准备工作 ::: tip 管理后台配置 小程序类目&#xff1a;住建&#xff08;硬性要求&#xff09; 功能-》订阅消息-》我的模版 申请模版&#xff1a;1、预约进度通知 2、申请结果通知 3、业务办理进度提醒 ::: 用户订阅一次后&#xff0c;可长期下发多条消息。目前长期性订阅…...

Studio One6.5中文版本版下载及功能介绍

Studio One是一款专业的音乐制作软件&#xff0c;由美国PreSonus公司开发。该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One的主要特点…...

Linux 内核中的内存映射:从虚拟地址到物理地址

Linux 内核中的内存映射&#xff1a;从虚拟地址到物理地址 引言 作为一名深耕操作系统和嵌入式开发的工程师&#xff0c;我深知地址管理的重要性。在系统开发中&#xff0c;合理的地址管理可以提高系统的效率和安全性。在 Linux 内核中&#xff0c;内存映射是实现虚拟地址到物理…...

从零上手FinalShell:Windows环境下的高效SSH连接与服务器管理实战

1. FinalShell是什么&#xff1f;为什么选择它&#xff1f; 如果你是Windows用户&#xff0c;第一次接触服务器管理&#xff0c;可能会被各种专业工具吓到。XShell虽然强大但收费&#xff0c;Putty又太简陋&#xff0c;这时候FinalShell就像个贴心的助手。我用了三年多&#xf…...

5分钟快速修复Windows更新故障:Reset Windows Update Tool完全指南

5分钟快速修复Windows更新故障&#xff1a;Reset Windows Update Tool完全指南 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …...

如何在个人电脑上搭建专属的图片搜索引擎:ImageSearch终极指南

如何在个人电脑上搭建专属的图片搜索引擎&#xff1a;ImageSearch终极指南 【免费下载链接】ImageSearch 基于.NET8的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 你是否曾经因为找不到某…...

Tomcat中间件能够提供的能力

Tomcat 中间件能够提供的能力主要包括以下几个方面&#xff1a;‌运行 Java Web 应用程序‌&#xff1a;Tomcat 是一个开源的 Web 应用服务器&#xff0c;主要用于运行基于 Java 的 Web 应用&#xff0c;包括 Servlet、JSP 和 JavaBean 等组件。‌提供 Servlet 容器功能‌&…...

收藏!从Prompt到Harness,AI工程升级三步搞定大模型应用

本文阐述了AI工程从关注Prompt到Context再到Harness的演进过程。Prompt工程负责明确任务指令&#xff0c;Context工程负责提供准确有效的信息供给&#xff0c;而Harness工程则关注AI在系统中的可靠执行与治理。三者并非替代关系&#xff0c;而是嵌套协作&#xff0c;共同推动AI…...

ClickHouse连接避坑指南:Python开发者常遇到的5个问题及解决方案

ClickHouse连接避坑指南&#xff1a;Python开发者常遇到的5个问题及解决方案 当Python开发者初次尝试与ClickHouse建立连接时&#xff0c;往往会遇到各种意料之外的障碍。这些看似简单的连接问题&#xff0c;实际上可能隐藏着深层次的配置陷阱或性能瓶颈。本文将深入剖析五个最…...

从GlobeLand30数据到统计报表:QGIS分区统计+Excel,打造你的地表覆盖分析工作流

从GlobeLand30到专业报表&#xff1a;QGISExcel高效地表覆盖分析全流程 地表覆盖数据是理解区域生态环境、规划土地利用的重要基础。GlobeLand30作为30米分辨率的全球地表覆盖数据集&#xff0c;为研究者提供了高精度的分析素材。但如何将这些数据转化为可操作的见解&#xff1…...

Qwen3-4B极速体验:流式输出+多轮记忆,打造丝滑文本交互

Qwen3-4B极速体验&#xff1a;流式输出多轮记忆&#xff0c;打造丝滑文本交互 在当今AI技术快速发展的背景下&#xff0c;文本交互模型已经成为日常工作和创作的重要助手。Qwen3-4B-Instruct-2507作为阿里通义千问系列中的纯文本优化版本&#xff0c;通过移除视觉模块冗余&…...

OpenCV实战:图像亮度、对比度与锐化的智能调节与优化

1. 图像处理基础概念解析 在开始动手实践之前&#xff0c;我们需要先理解几个关键概念。亮度、对比度和锐化这三个参数就像调节电视画面的三个旋钮&#xff0c;每个旋钮都会对图像产生独特的影响。 亮度&#xff08;Brightness&#xff09;就像房间里的灯光开关。调高亮度&…...