浅谈C#在unity应用中的工厂模式
文章目录
- 前言
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- Unity实战
前言
工厂模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装起来的方法,使得客户端代码不必直接依赖于具体类。这有助于降低代码的耦合度,提高代码的可维护性和可扩展性。在C#中,有三种常见的工厂模式:简单工厂模式、工厂方法模式和抽象工厂模式。下面详细解释这三种工厂模式。
简单工厂模式
简单工厂模式是最基本的工厂模式,它通过一个工厂类来创建对象。客户端只需要知道要创建的产品的类型,而不需要知道具体的实现类。
- 首先定义一个抽象产品类。该类主要定义了产品的共有属性和方法,用于子类继承和实现。
public abstract class Car
{public abstract void GetName();public void Refuel(){Console.WriteLine("汽车加油");}
}
- 其次定义每个产品的具体实现子类。该类实现并继承自抽象类,如需增加产品可直接创建新的子类并继承自抽象类即可。
public class FordCar: Car
{public override void GetName(){Console.WriteLine("我是福特汽车");}
}public class HondaCar: Car
{public override void GetName(){Console.WriteLine("我是本田汽车");}
}
- 然后定义核心类,即工厂类。该类通过创建了一个枚举类型参数来选择需要创建的产品实例。
public class CarFactory
{public static Car CreateCar(CarType carType){switch (carType){case CarType.FordCar:return new FordCar();break;case CarType.HondaCar:return new HondaCar();break;default:break;}return null;}public enum CarType{FordCar,HondaCar}
}
- 最后客户端调用。
class Program
{static void Main(string[] args){//通过CarFactory产品工厂创建了FordCar产品实例Car car = CarFactory.CreateCar(CarFactory.CarType.FordCar);car.GetName();//通过CarFactory产品工厂创建了HondaCar产品实例car = CarFactory.CreateCar(CarFactory.CarType.HondaCar);car.GetName();car.Refuel();}
}
对于客户端来说,其去除了与具体产品之间的依赖。
简单工厂模式的缺点主要就是违背了开闭原则
工厂方法模式
这是一种更高级的工厂模式,它通过抽象接口或基类中的工厂方法来创建对象。
具体实现由子类负责,因此更加灵活。这种设计方式有利于实现开闭原则,即对扩展开放,对修改封闭。
- 抽象产品类:
public abstract class Car
{public abstract void GetName();public void Refuel(){Console.WriteLine("汽车加油");}
}
- 具体产品类:
public class FordCar: Car
{public override void GetName(){Console.WriteLine("我是福特汽车");}
}public class HondaCar: Car
{public override void GetName(){Console.WriteLine("我是本田汽车");}
}
- 抽象工厂:
public abstract class CarFactory
{public abstract Car CreateCar();
}
- 具体产品工厂:
public class FordCarFactory: CarFactory
{public override Car CreateCar(){return new FordCar();}
}public class HondaCarFactory: CarFactory
{public override Car CreateCar(){return new HondaCar();}
}
- 客户端调用:
class Program
{static void Main(string[] args){//创建一个汽车工厂,只负责生产福特汽车产品CarFactory carFactory = new FordCarFactory();//在福特汽车工厂中生产一个福特汽车产品Car car = carFactory.CreateCar();car.GetName();//创建一个汽车工厂,只负责生产本田汽车产品carFactory = new HondaCarFactory();//在本田汽车工厂中生产一个本田汽车产品car = carFactory.CreateCar();car.GetName();//汽车加油car.Refuel();}
}
抽象工厂模式
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。它是工厂方法模式的推广,不仅仅创建一个对象,而是创建一系列相关的对象。
- 抽象产品类,有多少个不同产品就创建多少个抽象产品类。实例中创建了两种产品,即汽车和轮胎。
public abstract class Car
{public abstract void GetName();public void Refuel(){Console.WriteLine("汽车加油");}
}
public abstract class Tire
{public abstract void GetName();
}
- 具体产品类,不同产品继承不同抽象类。实例中定义了两种汽车和两种轮胎,汽车为一个产品等级,轮胎是另外一个产品等级。
public class FordCar: Car
{public override void GetName(){Console.WriteLine("我是福特汽车");}
}public class HondaCar: Car
{public override void GetName(){Console.WriteLine("我是本田汽车");}
} public class FordTire: Tire
{public override void GetName(){Console.WriteLine("我是福特轮胎。");}
}public class HondaTire: Tire
{public override void GetName(){Console.WriteLine("我是本田轮胎。");}
}
- 抽象工厂类,有多少个系列就可以创建多少个抽象工厂类。
public abstract class CarFactory
{//生产汽车public abstract Car CreateCar();//生产轮胎public abstract Tire CreateTire();
}
- 具体工厂类,同一系列可以创建多个具体的工厂,负责同一系列下的不同产品出的创建。
public class FordCarFactory: CarFactory
{public override Car CreateCar(){return new FordCar();}public override Tire CreateTire(){return new FordTire();}
}public class HondaCarFactory: CarFactory
{public override Car CreateCar(){return new HondaCar();}public override Tire CreateTire(){return new HondaTire();}
}
- 客户端调用:
class Program
{static void Main(string[] args){//首先创建一个汽车工厂CarFactory carFactory = new FordCarFactory();//然后对应工厂中生产出对应的不同产品。Car car = carFactory.CreateCar();car.GetName();Tire tire = carFactory.CreateTire();tire.GetName();carFactory = new HondaCarFactory();car = carFactory.CreateCar();car.GetName();tire = carFactory.CreateTire();tire.GetName();}
}
Unity实战
https://dingxiaowei.cn/2017/05/14/
相关文章:
浅谈C#在unity应用中的工厂模式
文章目录 前言简单工厂模式工厂方法模式抽象工厂模式Unity实战 前言 工厂模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装起来的方法,使得客户端代码不必直接依赖于具体类。这有助于降低代码的耦合度,提高代码的可维护性和可扩…...
卷积神经网络(Inception-ResNet-v2)交通标志识别
文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据 二、构建一个tf.data.Dataset1.加载数据2. 配置数据集 三、构建Inception-ResNet-v2网络1.自己搭建2.官方模型 五、设置动态学习率六、训练模型七、模型评…...
网易云音频数据如何爬取?
在当今数字化时代,音频数据的获取和处理变得越来越重要。本文将详细介绍如何使用Objective-C语言构建音频爬虫程序,以爬取网易云音乐为案例。我们将从Objective-C的基础知识开始,逐步深入到爬取思路分析、构建爬虫框架、完整爬取代码等方面&a…...
97、Text2NeRF: Text-Driven 3D Scene Generation with Neural Radiance Fields
简介 论文地址 使用扩散模型来推断文本相关图像作为内容先验,并使用单目深度估计方法来提供几何先验,并引入了一种渐进的场景绘制和更新策略,保证不同视图之间纹理和几何的一致性 实现流程 简单而言: 文本-图片扩散模型生成一…...
【C++】多态(上) 多态 | 虚函数 | 重写 | final、override | 接口继承与实现继承 | 抽象类
一、多态 概念 多态,就是多种状态,即不同的对象去完成同一个行为时会产生出不同的状态。比如:买票时,成人要原价买,学生和老人就可以享受优惠价便宜一点儿。同样是买票这个行为,不同的对象来做就有不同的…...
国内怎么投资黄金,炒黄金有哪些好方法?
随着我国综合实力的不断强大,投资市场的发展也日臻完善,现已成为了国际黄金市场的重要组成部分,人们想要精准判断金市走向,就离不开对我国经济等信息的仔细分析。而想要有效提升盈利概率,人们还需要掌握国内黄金投资的…...
springboot实现数据脱敏
springboot实现数据脱敏 怎么说呢,写着写着发觉 ”这写的什么玩意“ 。 总的来说就是,这篇文章并不能解决数据脱敏问题,但以下链接可以。 SpringBoot中利用自定义注解优雅地实现隐私数据脱敏 然后回到本文,本来是想基于AOP代理&am…...
uniapp实现多时间段设置
功能说明: 1 点击新增时间,出现一个默认时间段模板,不能提交 2 点击“新增时间文本”,弹出弹窗,选择时间,不允许开始时间和结束时间同时为00:00, <view class"item_cont"> …...
uni-app - 去除隐藏页面右侧垂直滚动条
全局配置 "globalStyle": { //全局配置 "scrollIndicator":"none", // 不显示滚动条 "app-plus":{ "scrollIndicator":"none" // 在APP平台都不显示滚动条 } }局部配置 "path": "pages/ind…...
一次简单的 Http 请求异常处理 (请求的 url 太长, Nginx 直接返回 400, 导致请求服务异常)
1 结论 按照惯例直接说结论。 后台服务 A 有一个 Http 接口, 代码如下: RequestMapping(value "/user", method RequestMethod.GET) public List<UserInfoVo> getUserInfoByUserIds(RequestParam(value "userIds") List<String> userIds…...
spring Cloud在代码中如何应用,erueka 客户端配置 和 服务端配置,Feign 和 Hystrix做高可用配置
文章目录 Eureka一、erueka 客户端配置二、eureka 服务端配置 三、高可用配置FeignHystrix 通过这篇文章来看看spring Cloud在代码中的具体应用,以及配置和注解; Eureka 一、erueka 客户端配置 1、Eureka 启禁用 eureka.client.enabledtrue 2、Eurek…...
C#8.0中新语法“is {}“的介绍及使用
一、C#7.0及之前is的使用 is操作符检查表达式的结果是否与给定类型兼容,或者(从c# 7.0开始)根据模式测试表达式。有关类型测试is操作符的信息,请参阅类型测试和类型转换操作符文章的is操作符部分。 1、is 模式匹配 从C࿰…...
编译器设计01-入门概述
编译器作用概述 源代码 → 编译器 目标代码 源代码\xrightarrow{\ \ \ 编译器\ \ \ }目标代码 源代码 编译器 目标代码 编译阶段概述 编译处理包括两个阶段:前端处理和后端处理,中间过程生成语法树。 编译处理:源代码 → 语法树 …...
SpringBoot封装Elasticsearch搜索引擎实现全文检索
一、前言 注:本文实现了Java对Elasticseach的分页检索/不分页检索的封装 ES就不用过多介绍了,直接上代码: 二、实现步骤: 创建Store类(与ES字段对应,用于接收ES数据) import com.alibaba.f…...
(C)一些题4
1. 以下叙述中正确的是( )。 A.C程序中的注释只能出现在程序的开始位置和语句的后面 B.C程序书写格式严格,要求行内只能写一个语句 C,C程序书写格式自由,一个语句可以写在多行上 D.用C语言编写的程序只能放在一个程序文件中 2.设有如下程序段 char …...
ChatGPT初体验:注册、API Key获取与ChatAPI调用详解
自从2022年10月,ChatGPT诞生以后,实际上已经改变了很多!其火爆程度简直超乎想象,一周的时间用户过百万,两个月的时间用户过亿。 目前ChatGPT4已经把2023年4月以前的人类的知识都学习到了,在软件工程里面&am…...
TCP/IP协议、三次握手、四次挥手
TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手,不是两次或者四次?3、TCP为什么是四次挥手,为什么不能是三次挥手将第二次挥手和第三次挥手合并?4、四次挥手时为什么TIME_W…...
Android U 匹配不到APN,无法发起数据建立的问题分析
问题 打开数据开关后,没有data PDN请求发起,因此无法上网。 根据日志确定是没有找到合适的data profile,原因一般有: 1、APN 没有配置 2、APN 类型/网络能力不满足——APN type或bearer 3、APN 配置了但被disable了——APN p…...
如何打造“面向体验”的音视频能力——对话火山引擎王悦
编者按:随着全行业视频化的演进,我们置身于一个充满创新与变革的时代。在这个数字化的浪潮中,视频已经不再只是传递信息的媒介,更是重塑了我们的交互方式和体验感知。作为字节跳动的“能力溢出”,火山引擎正在飞速奔跑…...
什么是NoOps
过去几年,自动化一直在推动整个 IT 行业向前发展。通过自动化某些任务,开发团队可以提高其能力,而无需感受到雇用新团队成员的预算压力。自动化还保证了更高的效率,特别是在操作和维护方面。 传统的软件开发工作流程涉及开发团队…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
