Unity设计模式之工厂模式

什么是工厂模式?

        工厂是一种创建型设计模式。通俗来讲就是提供一种封装对象创建的方式,将对象的创建和使用区分开。就是Unity里面通常用到的创建和管理对象。

工厂模式有什么优点?

        1、封装对象的创建方式,使其更加灵活、易于管理、可扩展、可维护,降低代码的耦合性。

        2、提供一种统一的对象创建方式,代码解读更加容易懂、逻辑更加清晰。

        3、可以根据不同的需求创建不同的对象。

工厂模式有什么缺点?

        1、违反了单一职责原则;添加新类型时需要修改工厂类。(不包含抽象工厂模式)

        2、增加了前期代码的复杂度,需要创建更多的类(基类、管理类、派生类等)

        感觉这也不算缺点吧。。。

工厂模式中的分类:

        普通工厂模式、工厂方法模式、抽象工厂模式。

普通工厂模式

1、创建一个类作为其他派生类的基类

public class FactoryBase : MonoBehaviour
{protected string name;public virtual void OnUse(){Debug.LogError(name);}
}

2、再创建两个派生类 Derive1、Derive2

public class Derive1 : FactoryBase
{public Derive1(){name = "Derive1";}public override void OnUse(){base.OnUse();GameObject o = new GameObject(name);o.AddComponent<Derive1>();}
}public class Derive2 : FactoryBase
{public Derive2(){name = "Derive2";}public override void OnUse(){base.OnUse();GameObject o = new GameObject(name);o.AddComponent<Derive1>();}
}

3、最后创建一个对象管理类

public class FactoryMgr : MonoBehaviour
{public static FactoryBase CreateItem(string deriveName){FactoryBase item = null;if (deriveName == "1"){item = new Derive1();}if (deriveName == "2"){item = new Derive2();}return item;}
}

应用普通工厂模式

这就是普通的工厂模式的应用

public class FactoryApply : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){FactoryMgr.CreateItem("1").OnUse();FactoryMgr.CreateItem("2").OnUse();}
}

工厂方法模式

1、定义派生类接口和派生类

public interface IDevive
{void Use();
}public class Devive1 : IDevive
{public void Use(){Debug.LogError("Devive1");}
}public class Devive2 : IDevive
{public void Use(){Debug.LogError("Devive2");}
}

2、再定义派生工厂接口和派生工厂类

public interface IFactory
{IDevive CreateDevive();
}public class Devive1Item : IFactory
{public IDevive CreateDevive(){return new Devive1();}
}public class Devive2Item : IFactory
{public IDevive CreateDevive(){return new Devive2();}
}

应用工厂方法模式

public class FactoryApply : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){var i1 = new Devive1Item().CreateDevive();i1.Use();var i2 = new Devive2Item().CreateDevive();i2.Use();}
}

抽象工厂模式

1、定义派生类接口和派生类

public interface IDevive
{void Use();
}public class Devive1 : IDevive
{public void Use(){Debug.LogError("Devive1");}
}public class Devive2 : IDevive
{public void Use(){Debug.LogError("Devive2");}
}

2、再定义派生工厂接口和派生工厂类

public interface IFactory
{IDevive CreateDevive();
}public class Devive1Item : IFactory
{public IDevive CreateDevive(){return new Devive1();}
}public class Devive2Item : IFactory
{public IDevive CreateDevive(){return new Devive2();}
}

3、抽象派生类管理器接口和派生类管理器

public interface IDeviveManager
{IFactory CreateDevive1Item();IFactory CreateDevive2Item();
}public class DeviveManager : IDeviveManager
{public IFactory CreateDevive1Item(){return new Devive1Item();}public IFactory CreateDevive2Item(){return new Devive2Item();}
}

应用抽象工厂模式

public class FactoryApply : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){IDeviveManager deviveManager = new DeviveManager();IFactory item1 = deviveManager.CreateDevive1Item();IDevive devive1 = item1.CreateDevive();devive1.Use();IFactory item2 = deviveManager.CreateDevive2Item();IDevive devive2 = item2.CreateDevive();devive2.Use();}
}

总结:

        工厂模式定义了一个创建对象的接口,但由子类决定实例化哪个类。它使一个类的实例化延迟到其子类。

        工厂模式通过将客户端代码与具体类的实例化过程解耦,使得系统更灵活。

        但是,每增加一个子模块就需要增加一个子类和工厂类,导致类的数量增加。

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

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

相关文章

【教学类-55-04】20240515图层顺序挑战(四格长条纸加黑色边框、4*4、7张,不重复5400张,16坐标点颜色哈希值去重、保留7色)

背景需求&#xff1a; 前文实现了7张色彩纸条加上黑色边框的需求。 【教学类-55-02】20240512图层顺序挑战&#xff08;四格长条纸加黑色边框、4*4、7张 、43200张去掉非7色有23040张&#xff0c;哈希算法快速去重剩余1221张&#xff09;-CSDN博客文章浏览阅读1k次&#xff0…

GPT-4o模型介绍和使用方法

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

9个优质免费视频素材网站推荐丨2024年最新资源合集

在短视频火爆的时代&#xff0c;高清、无水印、可商用的视频素材变得尤为重要。下面是我精心整理的9个常用免费视频素材网站&#xff0c;适合各类视频创作者。希望你能找到满意的素材&#xff01; 一、视频素材 1. 蛙学府 优点&#xff1a;丰富的正版商用素材&#xff0c;涵盖…

AI 绘画神器 Fooocus 高级用法:设置、风格、模型、高级设置

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文精选了一系列高级技巧和细致调整&#xff0c;旨在提升 Fooocus 用户在利用 Stable Diffusion 模型进行图像生成时的…

vue使用marked和highlight.js实现代码高亮效果

marked是对markdown进行解析的插件&#xff0c;它可以把markdown语法解析成html语法&#xff0c;从而实现页面效果&#xff0c;而highlight.js是对解析出的代码实现高亮效果 效果&#xff1a; 安装&#xff1a;避免踩我走的坑&#xff0c;安装尽量按照这个版本安装 npm install…

Linux进程——进程地址空间

前言&#xff1a;在讲完环境变量后&#xff0c;相信大家对Linux有更进一步的认识&#xff0c;而Linux进程概念到这也快接近尾声了&#xff0c;现在我们了解Linux进程中的地址空间&#xff01; 本篇主要内容&#xff1a; 了解程序地址空间 理解进程地址空间 探究页表和虚拟地址空…

matlab使用教程(71)—控制坐标区布局

1.与位置相关的属性和函数 有几个属性和函数可用于获取和设置坐标区的大小与位置。下表摘要显示了这些属性和函数。 函数或属性描述 OuterPosition 属性 使用此属性可以查询或更改坐标区的外边界&#xff0c;包括标题、标签和边距。要更改外边界&#xff0c;请将此属性指定为…

MySQL、JDBC复盘及规划

数据库仍有习题尚未做完&#xff0c;策略从一天做完改为每天5到10题&#xff0c;以此达到掌握和复习的效果&#xff0c;JDBC的六部仍需每天练习&#xff0c;从明天开始正式进行JavaWeb的学习&#xff0c;预计持续到七月中旬&#xff0c;还会完成一个书城项目&#xff0c;六月底…

Vue 快速入门:Vue初级

语法规则 前端渲染 渲染有几种方式&#xff1a;原生js、js模板、Vue模板语法 原生js 使用字符串拼接 js模板语法 Vue.js 模板语法概述 Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;其模板语法非常灵活和直观。Vue 的模板语法基于 HTML&#xff0c;可以通过指令…

Java为什么会成为现在主流的编程语言

Java为什么会成为现在的主流语言 前言一、Java语言概述Java是什么为什么大多数人会选择从事Java为什么从事Java的工作者数量从年递减 二、Java语言的特点简单性面向对象分布式&#xff08;微服务&#xff09;健壮性安全性体系结构中立可移植性解释型高性能多线程动态性 三、Jav…

UDP多对多组播通信

广播和多播仅应用于UDP。TCP是一个面向连接的协议&#xff0c;TCP一定是点对点的&#xff0c;一点是两个主机来建立连接的&#xff0c;TCP肯定是单播。只有UDP才会使用广播和组播。 如下示例实现一个UDP多对多的组播通信&#xff0c;进程中有收、发两个线程&#xff0c;分别表…

6款电脑精选工具软件推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1.IP地址查看工具——纯真ip数据库 纯真IP数据库是一个易于操作的IP地址查询工具&#xff0c;它允许用户通过输入IP地址来查询其对应的地理位置…

Django创建网站的地基

相关文档 1、为新网站创建一个文件夹&#xff08;这里是&#xff1a;locallibrary&#xff09; D:\django>mkdir locallibraryD:\django>cd locallibraryD:\django\locallibrary>dirVolume in drive D is 新加卷Volume Serial Number is B68C-03F7Directory of D:\dj…

【Uniapp】简易封装提示框showToast/showModal

组件 // 封装提示框 export const showModal (content, showCancel false, title "提示") > {return new Promise((resolve, reject) > {uni.showModal({title: title,content: content,showCancel: showCancel,success: (res) > {resolve(res);},fail:…

结合多模态 AI 谷歌展示 AR 眼镜原型机;Meta 被曝开发带摄像头的 AI 耳机丨 RTE 开发者日报 Vol.204

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

如何修改android 项目显示的app名

修改vlaues下的string.xml文件 修改这个标签中的内容就行

国产银河麒麟V10SP1系统安装Qt和MySql步骤

安装软件&#xff1a;准备好Kylin-Desktop-V10-SP1-Release-hwe-2107-x86_64.iso和qt-opensource-linux-x64-5.14.2.run 安装步骤&#xff1a; 1、VMWare软件中新建一个虚拟机并安装Kylin-Desktop-V10-SP1-Release操作系统&#xff0c;安装时候输入密码的地方记得要用英文&am…

“网络安全新纪元:等保2.0的详细解读与实践”

网络安全等级保护基本要求》&#xff08;等保2.0&#xff09;于2019年6月发布&#xff0c;是我国网络安全等级保护制度的一项重要标准。等保2.0主要针对关键信息基础设施的网络安全保护&#xff0c;对数据安全和个人信息保护提出了更高的要求。本文将对等保2.0进行详细解读&…

动态路由实验新手入门:快速掌握核心知识点

大家好&#xff0c;这里是G-LAB IT实验室。今天带大家学习一下华为动态路由实验配置&#xff0c;新手入门&#xff0c;快速掌握核心知识点&#xff01; 01、实验拓扑 02、实验需求 1.根据拓扑运行对应的路由协议 2.每个路由器都有自己的环回口&#xff0c;宣告的区域不限制 …

IDEA不能创建新项目和新模块

问题&#xff1a; IDEA不管是创建新项目还是新模块都创建不成功&#xff0c;会报如下图错误 解决方案&#xff1a; 在电脑设置里搜索 “防火墙和网络保护” &#xff0c;打开如下图所示 找到你所安装的IDEA&#xff0c;更改设置&#xff0c;选中IDEA 最后&#xff0c;确定&am…