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.hqwc.cn/news/501957.html

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

相关文章

3.1作业

作业要求&#xff1a; 通过w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 程序代码&#xff1a; #include<myhead.h> #define SER_IP "192.168.126.…

一文讲透:可视化大屏中3D元素的融入和使用方法

在可视化大屏中&#xff0c;3D元素融入的越来越多&#xff0c;贝格前端工场经常接到这类项目&#xff0c;很多老铁认为加个3D效果很easy&#xff0c;其实不然&#xff0c;工序非常复杂&#xff0c;总结如下。 一、什么是3D技术 三维展示&#xff08;3D展示&#xff09;是指使用…

Codeforces Round 930 (Div. 2)题解

A. Shuffle Party&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;给定一个n长数组&#xff0c;并使得a[i]i&#xff0c;现在定义一种操作swap(k):找出k的最大不等于自己的除数d&#xff0c;交换a[k]和a[d]&#xff0c;k从1开始直到n结束&#xff0c;问…

灯塔:HTML笔记

网页由哪些部分组成&#xff1f; *文字 图片 音频 视频 超链接 程序员写的代码是通过浏览器转换成网页的 五大浏览器有哪些&#xff1f; *IE浏览器 *火狐浏览器&#xff08;Firefox&#xff09; *谷歌浏览器&#xff08;Chrome&#xff09; *Safari浏览器 *欧朋浏览器&…

基于CVX凸优化的电动汽车充放电调度matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 CVX凸优化 4.2 电动汽车充放电调度 5.完整程序 1.程序功能描述 基于CVX凸优化的电动汽车充放电调度.仿真输出无电动汽车充电时的负载&#xff0c;电动汽车充电时cvx全局优化求解后的总…

LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

大模型量化技术原理-ZeroQuant系列

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;从而导致模型变得越来越大&#xff0c;因此&#xff0c;我们需要一些大模型压缩技术来降低模型部署的成本&#xff0c;并提升模型的推理性能。 模型压缩主要分…

Manacher

Manacher #include<bits/stdc.h> using namespace std; ​ const int N 1e6 9; char s[N]; int p[N]; int mian() {cin >> s 1;int n strlen(s 1);for (int i 2 * n 1; i > 1; --i)s[i] (i & 1) ? # : s[i >> 1];s[0] ^, s[2 * n 2] $;in…

使用Python语言实现一个基于动态数组的序列队列

一、动态数组的实现 首先&#xff0c;我们需要创建一个DynamicArray类&#xff0c;该类将管理我们的动态数组。 动态数组能够动态地调整其大小&#xff0c;以容纳更多的元素。 目录 一、动态数组的实现 代码示例&#xff1a; 二、序列队列的实现 接下来&#xff0c;我…

Redis 在 Linux 系统下安装部署的两种方式详细说明

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 Redis安装和配置 1、首先在官网下载好redis-6.0.9.tar.gzhttp://redis.io/ 或者使用 wget 命令下载&#xff1a;wget http://download.redis.io/releases/redis-6.0.9.tar.gz 2、下载使用上传到阿里…

力扣每日一题 使二叉树所有路径值相等的最小代价 满二叉树 贪心

Problem: 2673. 使二叉树所有路径值相等的最小代价 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int minIncrements(int …

笑营宝高校选修课报名考勤系统源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 随着高等教育的普及和教学模式的不断创新&#xff0c;高校选修课程体系日趋复杂多变。学生对课程选择的自由度提高&#xff0c;使得传统的选课和考勤管理方式变得繁琐且效率低下。目前&#xff0c;许多高校仍然采用纸…