复盘一下我用过的设计模式

news2024/9/22 15:47:37

建造者模式

保卫萝卜中使用了建造者模式。UML图如下:

接口:

public interface IBuilder<T>
{
    //获取到游戏物体身上的脚本对象,从而去赋值
    T GetProductorClass(GameObject gameObject);

    //使用工厂去获取具体的游戏对象
    GameObject GetProduct();

    //获取数据信息
    void GetData(T productClassGo);

    //获取特有资源与信息
    void GetOtherResource(T productClassGo);
}

 建造怪兽类

using UnityEngine;

public class MonsterBuilder : IBuilder<Monster>
{
    public int m_monsterID;
    private GameObject monsterGo;

    public void GetData(Monster productClassGo)
    {
        productClassGo.monsterID = m_monsterID;
        productClassGo.HP = m_monsterID * 100;
        productClassGo.currentHP = productClassGo.HP;
        productClassGo.moveSpeed = m_monsterID > 7 ? 7:m_monsterID;  //速度太快了。子弹根本追不上
        productClassGo.initMoveSpeed = m_monsterID > 7 ? 7 : m_monsterID;
        productClassGo.prize = m_monsterID * 50;
    }

    public void GetOtherResource(Monster productClassGo)
    {
        productClassGo.GetMonsterProperty();
    }

    public GameObject GetProduct()
    {
        GameObject itemGo = GameController.Instance.GetGameObjectResource("MonsterPrefab");
        Monster monster = GetProductorClass(itemGo);
        GetData(monster);
        GetOtherResource(monster);
        return itemGo;
    }

    public Monster GetProductorClass(GameObject gameObject)
    {
        return gameObject.GetComponent<Monster>();
    }
}

塔的建造者

using UnityEngine;

/// <summary>
/// 塔的建造者
/// </summary>
public class TowerBuilder : IBuilder<Tower>
{
    public int m_towerID;
    private GameObject towerGO;
    public int m_towerLevel;  //塔的等级

    public void GetData(Tower productClassGo)
    {
        productClassGo.towerID = m_towerID;
    }

    public void GetOtherResource(Tower productClassGo)
    {
        productClassGo.GetTowerProperty();
    }

    public GameObject GetProduct()
    {
        GameObject gameObject = GameController.Instance.GetGameObjectResource
            ("Tower/ID" + m_towerID.ToString() + "/TowerSet/" + m_towerLevel.ToString());
        Tower tower = GetProductorClass(gameObject);
        GetData(tower);
        GetOtherResource(tower);
        return gameObject;
    }

    public Tower GetProductorClass(GameObject gameObject)
    {
        return gameObject.GetComponent<Tower>();
    }
}

建造者模式与工厂模式的区别:

建造者设计模式(Builder Design Pattern)和工厂设计模式(Factory Design Pattern)都是面向对象设计中的创建型模式,但它们解决的问题和应用场景有所不同。

  • 在工厂方法中主要看中产品的整体创建,一般不考虑创建的各个部分细节;
  • 建造者模式一般用于对复杂产品的创建,可以进行分步骤详细创建;

建造者模式:

主要组件:

  •     Director(指挥者):负责使用构造器接口来构建一个复杂对象。
  •     Builder(构造器):定义对象的构建过程,包括设置属性、添加部件等方法。
  •     ConcreteBuilder(具体构造器):实现构造器接口,实现具体的构建方法。
  •     Product(产品):最终构建出的复杂对象。

建造者模式的优点是将对象的构建过程封装,使得代码更加清晰,同时能够灵活地构建不同的对象。

工厂模式:

工厂设计模式旨在通过一个工厂来创建对象,将对象的创建过程封装起来,客户端代码无需直接调用构造函数。它分为简单工厂、工厂方法和抽象工厂等形式。

  • 主要组件:

    • Factory(工厂):负责创建对象的接口或类。
    • ConcreteFactory(具体工厂):实现工厂接口,实际创建对象的地方。
    • Product(产品):工厂创建的对象。

工厂模式的主要优点是将对象的创建和客户端解耦,客户端只需通过工厂来获取对象,不需要关心对象的具体创建过程。

目的不同:

  •     建造者模式关注于创建复杂对象的构建过程,将构建过程和表示分离。
  •     工厂模式关注于对象的创建,将对象的创建过程封装在工厂中,以便在客户端中使用。

复杂性:

  •     建造者模式通常用于创建复杂对象,因为对象的构建过程可能涉及多个步骤和配置选项。
  •     工厂模式可以用于创建不同类型的对象,包括简单对象和复杂对象。

关注点:

  •     建造者模式更关注于对象的构建过程,尤其适合需要按照一定步骤构建对象的情况。
  •     工厂模式更关注于对象的创建,强调封装创建过程,便于对象创建的管理。

综上所述,建造者模式适用于构建复杂对象,而工厂模式适用于创建对象的封装和管理。选择适当的模式取决于你的设计需求和对象创建的复杂性。

资源工厂模式:

资源工厂接口

/// <summary>
/// 其他种类资源工厂的接口,每种工程获取的资源都不同
/// </summary>

public interface IBaseResourceFactory<T>
{
    T GetSingleResources(string resourcePath);

}

音频资源工厂

using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 音频资源工厂
/// </summary>

public class AudioClipFactory : IBaseResourceFactory<AudioClip>
{
    //资源字典
    protected Dictionary<string, AudioClip> factoryDict = new Dictionary<string, AudioClip>();
    protected string loadPath;

    public AudioClipFactory()
    {
        loadPath = "AudioClips/";
    }

    public AudioClip GetSingleResources(string resourcePath)
    {
        AudioClip itemGo = null;
        string itemLoadPath = loadPath + resourcePath;

        if (factoryDict.ContainsKey(resourcePath))
        {
            itemGo = factoryDict[resourcePath];
        }
        else
        {
            itemGo = Resources.Load<AudioClip>(itemLoadPath);
            factoryDict.Add(resourcePath, itemGo);
        }

        if (itemGo == null)
        {
            Debug.Log(resourcePath + "的资源获取失败,失败路径为:" + itemLoadPath);
        }

        return itemGo;
    }


}

protected Dictionary<string, RuntimeAnimatorController> factoryDict = new Dictionary<string, RuntimeAnimatorController>();

获取的资源可以用一个字典存起来方便之后继续使用

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

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

相关文章

探索生成式AI Agent,让公众自动化触手可及

在科技浪潮的推动下&#xff0c;AI Agent市场正经历深刻变革。Kognitos智能RPA厂商凭借675万美元融资和生成式AI自动化的定位&#xff0c;吸引业界关注。然而&#xff0c;微软早已将ChatGPT融入Power Platform&#xff0c;提供低代码应用开发体验&#xff0c;引领市场。初创公司…

聚类算法之高斯混合模型聚类 (Gaussian Mixture Model, GMM)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 高斯混合模型&#xff08;GMM&#xff09;是统计模型中的一颗璀璨之星&#xff0c;它为数据提供了一种复杂而又强大的表示方法。在机器学习的许多…

2024年云服务器ECS价格表出炉——腾讯云

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

C语言之strchr用法实例(八十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

产品经理面试自我介绍,这3大错误千万别犯!

金三银四求职季&#xff0c;你是不是也有面试的冲动&#xff01;但面试并不是头脑一热就能取得好结果&#xff0c;在此之前&#xff0c;必须得有周全的准备&#xff0c;才能应对好面试官的“连环问”&#xff01; 所以&#xff0c;今天这篇产品经理面试干货分享给大家~ 今天文…

选择靠谱的su模型库免费下载,让你事半功倍!

在建筑设计、室内设计等领域&#xff0c;SU模型库的使用已经成为了一种趋势。选择一个靠谱的SU模型库进行免费下载&#xff0c;确实可以大大提高设计工作的效率。那么&#xff0c;如何选择一个靠谱的su模型库免费下载呢? 一、了解su模型库的基本功能 在选择su模型库时&#xf…

第十三届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 裁纸刀试题 B: 寻找整数试题 C : \mathrm{C}: C: 求和试题 D: GCD试题 E: 蜂巢试题 F : \mathrm{F}: F: 全排列的价值试题 G: 青蛙过河试题 H \mathrm{H} H : 因数平方和试题 I: 最优清零方案试题 J : \mathrm{J}: J: 推导部分和 发现…

「MySQL」数据库约束

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;数据库 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 数据库约束 &#x1f349;约束类型&#x1f34c;NOT NULL&#x1f34c;UNIQUE&#x1f34c;DEFAULT&#x1f34c;主键&#x1f34c;外键…

HSP_03章_Pytho n 数据类型

文章目录 024 Python数据类型概述025 Python_整型int25-1各进制的整型表示方法25-2 Python_整型int 字节 026 Python_浮点型float26-1 浮点型的表现形式26-2 浮点型的大小限制边界26-3 浮点类型计算后,存在精度的损失,可以使用Decimal类进行精确计算 027 Python_布尔类型27-1 P…

Navicat Premium 16中文---数据库管理与开发的强大引擎

Navicat Premium 16是一款功能强大的数据库管理工具&#xff0c;旨在为用户提供高效、便捷的数据库连接、管理和保护体验。该软件支持多种数据库系统&#xff0c;如MySQL、Oracle、SQL Server等&#xff0c;满足用户多样化的需求。通过直观的图形界面&#xff0c;用户可以轻松进…

微信小程序实战:无痛集成腾讯地图服务

在移动互联网时代,地图服务无疑是应用程序中最常见也最实用的功能之一。无论是导航定位、附近搜索还是路线规划,地图服务都能为用户提供极大的便利。在微信小程序开发中,我们可以轻松集成腾讯地图服务,为小程序赋能增值体验。本文将详细介绍如何在微信小程序中集成使用腾讯地图…

Fomepay哪个卡段可以充值ChatGPT4

这两天Fomepay的5347与556150两个卡段真对AI订阅进行维护&#xff0c;所以想要充值ChatGPT4的小伙伴就要开4866卡段&#xff0c;这个卡段不可以开openai api key 点击获取486695卡段进行充值 开卡步骤非常简单 1、注册 2、点击申请卡 3、填写姓名&#xff0c;支付即可 4、开…

产品经理面试如何自我介绍?

金三银四求职季&#xff0c;你是不是也有面试的冲动&#xff01;但面试并不是头脑一热就能取得好结果&#xff0c;在此之前&#xff0c;必须得有周全的准备&#xff0c;才能应对好面试官的“连环问”&#xff01; 所以&#xff0c;今天这篇产品经理面试干货文章&#xff0c;别…

【linux】进程的地址空间

1.代码看现象引入 #include<stdio.h>#include<unistd.h>#include<string.h> #include<stdlib.h>int val100;int main (){ printf("i am father,pid:%d,ppid:%d,val:%d&#xff0c;&val:%p\n",getpid(),getppid(),val,&val);size_t…

Spring中@Service 、@Component、@Repository等注解区别是什么?

一、问题解析 在Spring框架中&#xff0c;有很多用来声明Spring管理的bean的常用注解。它们都是Component的特化形式&#xff0c;用于指定不同类型的组件&#xff0c;主要有以下几个&#xff1a; 1Component&#xff1a;是一个通用的组件声明注解&#xff0c;表示该类是一个Sp…

利用PSR,三步实现业务快速加载

01 什么是PSR PSR是通信业界在BSS/OSS域面向产品设计和业务开通过程中提出的一个标准化信息分层解耦和映射的框架&#xff0c;按照国际电信论坛TMF推荐的SID信息框架的标准&#xff0c;主要分为产品域、服务域和资源域等三层&#xff0c;支撑通信业务的快速加载和敏捷开通。 TM…

【LeetCode: 4. 寻找两个正序数组的中位数 + 二分查找】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

海外客户获取难?海外云手机助力电商引流!

海外电商面临的市场竞争激烈&#xff0c;如何在海外市场获客成为了摆在许多卖家面前的难题。而在这个问题的解决方案中&#xff0c;海外云手机崭露头角&#xff0c;成为助力电商引流的新利器。 在当前市场中&#xff0c;云手机主要用于游戏挂机&#xff0c;但其潜力在海外电商领…

什么是虚拟线程?

1、典型回答 Java 中的虚拟线程&#xff0c;也叫做协程或“轻量级线程”&#xff0c;它诞生于JDK 19(预览 API)&#xff0c;正式发布于 JDK 21&#xff0c;它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程&#xff0c;不直接和操作系统的物理线程一一对应&#xff0c;因此它可…

Anaconda配置系统环境

首先&#xff0c;右键此电脑&#xff0c;点击属性 点击高级系统设计 点击环境变量 点击环境变量中系统环境下的Path&#xff0c;双击 如下图&#xff0c;添加这四项即可&#xff0c;注意&#xff0c;这都是Anaconda的安装目录下的内容 在windowsR的cmd情况下&#xff0c;输入co…