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

news2024/10/6 1:40:47

本文由 简悦 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.coloradmin.cn/o/1480041.html

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

相关文章

(2024,MixLoRA,任务干扰,独立因子选择,条件因子选择)使用 LoRA 的条件混合进行多模态指令调优

Multimodal Instruction Tuning with Conditional Mixture of LoRA 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 3. 任务干扰在多模态指令调优中的 LoRA 应用 3.1 背景&am…

代码随想录算法训练营第二十八天补|93.复原IP地址 ● 78.子集 ● 90.子集II

组合问题:集合内元素的组合,不同集合内元素的组合 分割问题:本质还是组合问题,注意一下如何分割字符串 回溯模板伪代码 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素&#xf…

使用Python,maplotlib绘制树型有向层级结构图

使用Python,maplotlib绘制树型有向层级结构图 1. 效果图2. 源码2.1 plotTree.py绘制层级结构及不同样式2.2 plotArrow.py 支持的所有箭头样式 参考 前俩篇博客介绍了 1. 使用Python,networkx对卡勒德胡赛尼三部曲之《群山回唱》人物关系图谱绘制 2. 使用…

江科大stm32学习笔记——【5-2】对射式红外传感器计次旋转编码计次

一.对射式红外传感器计次 1.原理 2.硬件连接 3.程序 CountSensor.c: #include "stm32f10x.h" // Device header #include "Delay.h"uint16_t CountSensor_Count;void CountSensor_Init(void) {//配置RCC时钟:RCC_APB2Perip…

房贷计算器微信小程序原生语言

微信小程序: 房贷计算器 效果: 输入 300万 结果 还款明细 一共有3个页面 1、输入页面 2、结果页面 3、详情页面 1 index页面 index.wxml文件 <view class="text-black"><!--房屋总价--><view class="cu-bar bg-white solid-bottom"&…

Redis--事务机制的详解及应用

Redis事务的概念&#xff1a; Redis事务就是将一系列命令包装成一个队列&#xff0c;在执行时候按照添加的顺序依次执行&#xff0c;中间不会被打断或者干扰&#xff0c;在执行事务中&#xff0c;其他客户端提交的命令不可以插入到执行事务的队列中&#xff0c;简单来说Redis事…

Vue之监测数据的原理(对象)

大家有没有想过&#xff0c;为什么vue可以监测到数据发生改变&#xff1f;其实底层借助了Object.defineProperty&#xff0c;底层有一个Observer的构造函数 让我为大家简单的介绍一下吧&#xff01; 我用对象为大家演示一下 const vm new Vue({el: "#app",data: {ob…

Harbor 的安装及使用

Harbor 安装官网手册&#xff1a; https://goharbor.io/docs/2.10.0/install-config/download-installer/ Harbor 发布包地址&#xff1a; https://github.com/goharbor/harbor/releases 在部署harbor的前提下先安装docker 和 docker-compose 安装docker&#xff1a;https://d…

Opencv基础与学习路线

Opencv Opencv每一篇目具体&#xff1a; Opencv(1)读取与图像操作 Opencv(2)绘图与图像操作 Opencv(3)详解霍夫变换 Opencv(4)详解轮廓 Opencv(5)平滑处理 具体Opencv相关demo代码欢迎访问我的github仓库&#xff08;包含python和c代码&#xff09; demo代码 文章目录 Opencv一…

<专利>机器人3D视觉快速定位抓取方法及系统

摘要&#xff0c;此专利无可用的关键技术信息&#xff0c;基本都是下面几句话反复说。。。 本发明提供了一种机器人3D快速定位抓取方法及系统&#xff0c; 包括&#xff1a; 通过高速的3D结构光成像对目标物体的表面轮廓进行扫描&#xff0c; 形成点云数据&#xff1b;对所述点…

idea 手动打 jar 包

1.在 File 中找到并点击 Project Structure 2.按图中高亮的部分依次点击 3.在 Main Class 处设置要打包的类&#xff0c;记得在 Directory for ... 处设置目录为根目录&#xff0c;设置好以后点击两次 OK 回到首页 4.在页面上方找到 Build &#xff0c;点击 Build Artifacts...…

蓝桥杯练习系统(算法训练)ALGO-993 RP大冒险

资源限制 内存限制&#xff1a;64.0MB C/C时间限制&#xff1a;200ms Java时间限制&#xff1a;600ms Python时间限制&#xff1a;1.0s 问题描述 请尽情使用各种各样的函数来测试你的RP吧~~~ 输入格式 一个数N表示测点编号。 输出格式 一个0~9的数。 样例输入 0 样…

基于React全栈Sora AI视频案例展示项目

花了一天时间基于React Next全栈开发的Sora AI 演示项目 Preview: https://sora.langchat.cn/ Github&#xff1a;https://github.com/tycoding/lang-sora 欢迎大家star、fork呀&#xff01; 这是一套完整的React & Next.js项目&#xff0c;包含前后端交互、路由、数据库…

Android14之解决编译报错:bazel: no such file or directory(一百八十九)

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

企业微信变更主体怎么改?

企业微信变更主体有什么作用&#xff1f;做过企业运营的小伙伴都知道&#xff0c;很多时候经常会遇到现有的企业需要注销&#xff0c;切换成新的企业进行经营的情况&#xff0c;但是原来企业申请的企业微信上面却积累了很多客户&#xff0c;肯定不能直接丢弃&#xff0c;所以这…

靶机渗透之sar

Name: Sar: 1Date release: 15 Feb 2020Author: LoveSeries: Sar Download: https://drive.google.com/open?id1AFAmM21AwiAEiVFUA0cSr_GeAYaxd3lQ 对于vulnhub中的靶机&#xff0c;我们都需先下载镜像&#xff0c;然后导入VM&#xff0c;并将网络连接改为NAT模式。首先我们…

uniapp实战:父子组件对象数组传参

需求说明 1.父组件传参给子组件 1.1子组件中定义属性unitList 1.2 父组件中将data中的unitList传递给子组件 2.子组件向父组件传参 2.1子组件设置用户名文本框以及切换操作属性 2.2 子组件对应操作(文本输入以及按钮切换)添加自…

【学习笔记】深度学习实战 | LeNet

简要声明 学习相关网址 [双语字幕]吴恩达深度学习deeplearning.aiPapers With CodeDatasets 深度学习网络基于PyTorch学习架构&#xff0c;代码测试可跑。本学习笔记单纯是为了能对学到的内容有更深入的理解&#xff0c;如果有错误的地方&#xff0c;恳请包容和指正。 参考文献…

C# 获取类型 Type.GetType()

背景 C#是强类型语言&#xff0c;任何对象都有Type&#xff0c;有时候需要使用Type来进行反射、序列化、筛选等&#xff0c;获取Type有Type.GetType, typeof()&#xff0c;object.GetType() 等方法&#xff0c;本文重点介绍Type.GetType()。 系统类型/本程序集内的类型 对于系…

C++——模板详解

目录 模板 函数模板 显示实例化 类模板 模板特点 模板 模板&#xff0c;就是把一个本来只能对特定类型实现的代码&#xff0c;变成一个模板类型&#xff0c;这个模板类型能转换为任何内置类型&#xff0c;从而让程序员只需要实现一个模板&#xff0c;就能对不同的数据进行操…