浅谈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 行业向前发展。通过自动化某些任务,开发团队可以提高其能力,而无需感受到雇用新团队成员的预算压力。自动化还保证了更高的效率,特别是在操作和维护方面。 传统的软件开发工作流程涉及开发团队…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...