Unity 游戏设计模式:工厂模式

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

工厂模式是一种创建型设计模式,它提供了一种封装对象实例化过程的方式,使得客户端代码与具体类的实现解耦。

在 C# 的游戏设计中,模式有以下作用:

对象的创建与使用分离: 单工厂模式将对象的创建过程放在一个单独的工厂类中,使得客户端代码不直接依赖于具体的类实现。客户端只需要通过工厂类来创建对象,而不需要了解对象的具体实现细节。

易于扩展: 如果需要添加新的游戏元素或功能,只需要修改工厂类,而不需要修改客户端代码。这使得系统更加灵活,易于扩展和维护。

代码复用: 工厂模式可以在多个地方共享,以确保对象的一致性创建。这有助于减少重复的代码,提高代码的可维护性。

降低耦合度: 客户端代码不需要直接知道如何创建对象,只需通过工厂类来获取所需的对象。这降低了系统中各个类之间的耦合度,使得系统更易于理解和维护。

工厂模式用于创建对象实例,例如创建不同类型的敌人(Enemy)或武器(Weapon)。

分为:简单工厂模式,工厂方法模式,抽象工厂模式

优点:

1. 简单工厂模式

需要创建的对象类:

//游戏对象类
interface IGameObject
{void LogMe();
}
//让游戏对象继承此接口,这样就可以使用接口装载各种对象
class Enemy : IGameObject
{public void LogMe(){Console.WriteLine("我是敌人");}
}
class Player : IGameObject
{public void LogMe(){Console.WriteLine("我是玩家");}
}
class Goods : IGameObject
{public void LogMe(){Console.WriteLine("我是商品");}
}

下面为简单工厂类

    //创建一个接口表示游戏对象//也可以创建一个类,但方法记得要写virtual和override不然表现不了多态//创建简单工厂类
class GameObjectFactory
{//实现在工厂创建对象的方法并返回public static IGameObject CreateItem(string name){switch (name){case "Enemy":return new Enemy();case "Player":return new Player();case "Goods":return new Goods();default:throw new ArgumentException($"无效的对象名: {name}");}}
}class Program{static void Main(string[] args){//调用工厂类创建对象IGameObject enemy = GameObjectFactory.CreateItem("Enemy");IGameObject player = GameObjectFactory.CreateItem("Player");IGameObject goods = GameObjectFactory.CreateItem("Goods");enemy.LogMe();player.LogMe();goods.LogMe();}}

2. 工厂方法模式

工厂方法模式是对简单工厂模式进一步的解耦,在工厂方法模式中是 “一类产品对应一个工厂类”

而这些工厂类都继承于一个抽象工厂。这相当于是把原本会随着业务扩展而庞大的简单工厂类,拆分成了一个个的具体产品工厂类,这样代码就不会都耦合在同一个类里。

interface IFactory
{IGameObject CreateGameObject();
}
//敌人工厂
class EnmyFactory : IFactory
{public IGameObject CreateGameObject(){return new Enemy();}
}
//玩家工厂
class PlayerFactory : IFactory
{public IGameObject CreateGameObject(){return new Player();}
}
//使用:IFactory enemyFactory = new EnmyFactory();//创建敌人工厂IGameObject enemy = enemyFactory.CreateGameObject();//通过敌人工厂创建敌人IFactory playerFactory = new PlayerFactory();//创建玩家工厂IGameObject player = playerFactory.CreateGameObject();//通过玩家工厂创建玩家

3. 抽象工厂模式

抽象工厂模式是工厂方法模式的加强版,抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对一个产品对应一个工厂类,而抽象工厂模式面对多个产品对应一个工厂类,一个工厂角色可以负责多个不同产品等级结构中的产品对象的创建 。

//在上面的游戏对象类在加一些
//不同敌人类class BigEnemy : IGameObject{public void LogMe(){Console.WriteLine("我是大敌人");}}class SmallEnemy : IGameObject{public void LogMe(){Console.WriteLine("我是小敌人");}}
//不同玩家类class BigPlayer : IGameObject{public void LogMe(){Console.WriteLine("我是大玩家");}}class SmallPlayer : IGameObject{public void LogMe(){Console.WriteLine("我是小玩家");}}

以下为抽象工厂类:

interface IFactory
{IGameObject CreateBigOne();IGameObject CreateSmallOne();
}
//创建敌人工厂
class EnemyFactory : IFactory
{public IGameObject CreateBigOne(){return new BigEnemy();}public IGameObject CreateSmallOne(){return new SmallEnemy();}
}
//创建玩家工厂
class PlayerFactory : IFactory
{public IGameObject CreateBigOne(){return new BigPlayer();}public IGameObject CreateSmallOne(){return new SmallPlayer();}
}
//使用IFactory enemyFactory = new EnemyFactory();//创建敌人工厂IGameObject bigEnemy = enemyFactory.CreateBigOne();IGameObject smallEnemy = enemyFactory.CreateSmallOne();IFactory playerFactory = new PlayerFactory();//创建玩家工厂IGameObject bigPlayer = playerFactory.CreateBigOne();IGameObject smallPlayer = playerFactory.CreateSmallOne();

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

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

相关文章

Keepalived介绍、架构和安装

Keepalived介绍、架构和安装 文章目录 Keepalived介绍、架构和安装1.Keepalived(高可用性服务)1.1 Keepalived介绍1.2 Keepalived 架构1.3 Keepalived 相关文件 2.Keepalived安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙…

mongo之常用数据库操作

目录 一、准备环境 二、日常记录及执行示范 连接数据库查询版本查询表总数模糊查询(使用正则)查询文档中数据条数排序大于等于查询有哪些库时间查询不在条件内的查询复制数据更新字段名称删除数据库 四、高阶查询 五、备份迁移数据库 总结 一、准备环境 借鉴:…

模型选择与评估

🚩 机器学习的一般流程包括:数据集的准备与预处理、搭建模型、模型训练、模型评估与应用。 在现实任务中,我们往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型…

unity中Canvas下射线检测

rayPos Input.touchCount > 0 ? mCamera.ScreenToWorldPoint(Input.GetTouch(0).position):mCamera.ScreenToWorldPoint(Input.mousePosition); mHitInfo Physics2D.Raycast(rayPos, -Vector2.up, 0.001f); 检测所有物体 rayPos Input.touchCount…

dcat admin自定义操作按钮

dcat admin自定义按钮,弹框操作,虽然有文档但是有一些地方没写清楚 文档地址:https://learnku.com/docs/dcat-admin/1.x/tools-form/8125#modal 运行 php artisan admin:action 命令,选择选项 2,生成数据表格行操作类…

模块整理!YOLOv9中的“Silence”、“RepNCSPELAN4”、“ADown”、“CBLinear”创新模块汇总!

代码链接:https://github.com/WongKinYiu/yolov9/tree/main 论文链接:YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 大量文字及图片来袭! 本文整理了YOLOv9中的创新模块,附代码和结构图&a…

【Java程序设计】【C00323】基于Springboot的高校科研信息管理系统(有论文)

基于Springboot的高校科研信息管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的高校科研信息管理系统,本系统有管理员、学校管理员、科研人员三种角色; 管理员:首页、个…

Vue3下使用vue-grid-layout从外部拖入demo10

由于Vue3文档缺失,示例10也是也跑不起来,这边参考示例改动了一下。 改动的点主要是this指向、$children相关的问题 在Vue3中移除了$children可以使用$ref替代 参考文章:计算坐标方法重写、文档示例 关键点:计算中的子组件取值使用…

JavaWeb之 创建 Web项目,使用Tomcat 部署项目,使用 Maven 构建Web项目(一万八千字详解)

目录 前言3.1 Tomcat 简介3.1.1 什么是 Web服务器3.1.2 Tomcat 是什么3.1.3 小结 3.2 Tomcat 的基本使用3.2.1 下载 Tomcat3.2.2 安装 Tomcat3.2.3 卸载 Tomcat3.2.4 启动 Tomcat3.2.5 关闭 Tomcat3.2.6 配置 Tomcat3.2.7 在 Tomcat 中部署 Web项目 3.3 在 IDEA 中创建 Web 项目…

(C语言)二分查找

在⼀个升序的数组中查找指定的数字n,很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低。⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你…

【电路笔记】-RC网络-RC积分器

RC积分器 文章目录 RC积分器1、概述2、RC积分器3、电容电压4、单脉冲 RC 积分器5、RC积分器示例6、RC 积分器作为正弦波发生器7、总结RC 积分器是一个串联的 RC 网络,可产生与积分的数学过程相对应的输出信号。 1、概述 对于无源 RC 积分器电路,输入连接到电阻,而输出电压取…

GCN 翻译 - 1

ABSTRACT 我们提出了一种可扩展的在以图结构为基础的数据上的半监督学习,这种方法直接作用在图数据上,可以看做是卷积神经网络的变种。我们选择了图谱理论里面的一阶近似作为我们的卷积结构。我们的模型能够随着图的规模线性伸缩,并且隐藏层…

数组中只出现一次的两个数字

数组中只出现一次的两个数字 背景题目描述题解 背景 刷到此题的时候,只写出了最普通的解法,最后看了二进制解法,叹为观止,不禁感叹到它的巧妙,因此记录一下,共勉。 题目描述 牛客地址: https://www.nowc…

【生态适配】亚信安慧AntDB数据库与FT-2000+/64处理器完成兼容互认

日前,亚信安慧AntDB数据库完成了与FT-2000/64处理器的兼容互认。经湖南亚信安慧科技有限公司(简称“亚信安慧”)与飞腾信息技术有限公司(简称“飞腾公司”)的严格测试,亚信安慧AntDB数据库V6.2在FT-2000/64…

Android Activity启动模式详解

在Android开发中,Activity的启动模式对于应用程序的行为和用户体验至关重要。Android提供了五种不同的启动模式,它们分别是:standard、singleTop、singleTask、singleInstance和singleInstancePerTask。每种启动模式都有其特定的行为和用途。…

备战蓝桥杯————前缀和数组1

一、基本概念 定义:前缀和数组(Prefix Sum Array)是一个数组,它存储了原数组(或序列)的连续子数组之和。对于一个给定的数组 nums,其前缀和数组 cumulativeSum 的第 i 个元素 cumulativeSum[…

【前端素材】推荐优质在线家具电商网页Hurst平台模板(附源码)

一、需求分析 1、系统定义 家具电商平台是指专门销售家具产品的在线电子商务平台。这些平台专注于家具类商品的销售和服务,为消费者提供方便快捷的购买体验。 2、功能需求 在线家具商城平台是指通过互联网提供家具购买服务的电子商务平台。这类平台为消费者和家…

基于ESP32的MicroPython项目量产烧写指南

背景 前段时间用MicroPython开发了一个项目,硬件是ESP32-C3,目前准备量产,我需要提供固件以供加工厂批量烧录,需要把我有程序的板子里的程序读出来,然后下到别的板子上,以下做这件事情的过程记录。 1.固件…

专利实缴评估

专利实缴评估通常是指在企业进行注册资本实缴时,将专利权作为出资的形式,需要对专利权的价值进行评估,以确定其作为注册资本的数额。 这项评估过程主要涉及以下几个步骤: 1.专利权确认: 首先,需要明确待评…

专利转让具体怎么做

专利转让是指专利权人将自己的专利权全部或部分转移给他人的法律行为。在中国,专利转让的流程一般包括以下几个步骤: 1.签订转让合同:•专利权人(转让方)与受让人协商一致后,需签订书面的专利权转让合同。…