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 update
    void 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 update
    void 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 update
    void 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();
    }
}

总结:

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue和Django前后端实现跨域

1.为什么要解决跨域&#xff1a; 前端与后端分处不同的域名&#xff0c;因为客户端访问不同源的服务端时会遭到浏览器的同源策略的拦截&#xff0c;所以我们需要配置CORS&#xff0c;处理的方式有很多&#xff0c;先来说下自己学习到的。 2.前端处理跨域&#xff1a; 前端项目是…

JVM运行时内存:程序计数器

文章目录 1. 程序计数器的作用2. 程序计数器的基本特征3. 程序计数器的问题 运行时内存整体结构如下图所示: 1. 程序计数器的作用 为了保证程序(在操作系统中理解为进程)能够连续地执行下去&#xff0c;CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作…

文档分类FastText模型 (pytorch实现)

文档分类FastText FastText简介层次softmaxN-gram特征FastText代码&#xff08;文档分类&#xff09; FastText简介 FastText与之前介绍过的CBOW架构相似&#xff0c;我们先来会议一下CBOW架构&#xff0c;如下图&#xff1a; CBOW的任务是通过上下文去预测中间的词&#xff0…

ES6之数值的扩展

1. 数值的扩展 1.1. 二进制和八进制字面量表示:1.2. 数值判断方法: 1.2.1. Number.isFinite() 检查一个值是否为有限的数值。1.2.2. Number.isNaN() 更准确地检测NaN值。1.2.3. 传统的全局方法 isFinite() 和 isNaN() 的区别 1.3. 数值转换方法:1.4. 整数检查与精度: 1.4.1. Nu…

探秘Web3科技:科技变革的下一个风口

引言 随着互联网的发展&#xff0c;我们正处于一个数字化时代&#xff0c;而Web3技术被认为是数字革命的下一个风口。相较于传统的Web2&#xff0c;Web3技术以其去中心化、安全可信的特点&#xff0c;正在引领着科技变革的潮流。本文将深入探讨Web3科技&#xff0c;揭示其背后…

可用在vue自动导入的插件unplugin-auto-import

在大多数vue3开发中&#xff0c;基本所有页面都会引用vue3 componsition api&#xff0c;如下代码 想这种vue3 架构中自带的api&#xff0c;如果在全局配置一下的话&#xff0c;就可以减少一部分代码量&#xff0c;只是在代码编译的时候&#xff0c;会添加相应的引用&#xff…

后台菜单数据递归展示

后台菜单数据递归展示 效果示例图aslide.vueaslideItem.vuemenu 效果示例图 aslide.vue <script setup>import {ref} from vue;const props defineProps({isCollapse: {type: Boolean,default: false}});import AslideItem from "./aslideItem.vue"const def…

ADS使用记录之使用RFPro进行版图联合仿真

ADS使用记录之使用RFPro进行版图联合仿真 在ADS中&#xff0c;我们往往使用EM仿真来明确电路的实际性能&#xff0c;但是常规的方法我们只会得到S参数&#xff0c;对于场还有电路的电流分布往往不进行检查。但是在实际中&#xff0c;观察场和电流分布是非常有意义的&#xff0…

Qt编译和使用freetype矢量字库方法

在之前讲过QT中利用freetype提取字库生成图片的方法&#xff1a; #QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览阅读1.2k次。这是某个项目中要用到的片段&#xff0c;结合上一篇文章#QT从字体名获取字库文件路径使用// 保存位图int SaveBitmapToFile(HBITMAP hBi…

如何使用一段传输线表示电感和电容

文中部分图片来自于《complete Wireless design》 如何使用一段传输线来表示电感和电容&#xff0c;本文将就此内容展开&#xff1a;

Python 渗透测试:反弹 shell (反弹 后门 || 程序免杀)

什么叫 反弹 shell 反弹 shell (Reverse Shell) 是一种常见的渗透测试技术,它指的是受害者主机主动连接攻击者的主机,从而让攻击者获得对受害者主机的控制权。在一个典型的反弹 shell 攻击中,攻击者会在自己的主机上监听一个特定的端口,然后诱使目标主机主动连接到这个端口。当…

react18【系列实用教程】useReducer —— 升级版的 useState (2024最新版)

useReducer 可看做升级版的 useState &#xff0c;其强大之处在于&#xff0c;可以自定义复杂的响应式变量修改逻辑。 useReducer 语法 useReducer 是 hook 函数 第一个参数&#xff08;必要&#xff09;&#xff1a; 自定义的 reducer 函数&#xff08;详见下文介绍&#xff…

图片转base64【Vue + 纯Html】

1.template <el-form-item label"图片"><div class"image-upload-container"><input type"file" id"imageUpload" class"image-upload" change"convertToBase64" /><label for"imageU…

AI图书推荐:ChatGPT 和Power BI驱动未来金融投资变革

《ChatGPT 和Power BI驱动未来金融变革》&#xff08;The Future of Finance with ChatGPT and Power BI&#xff09;由James Bryant和Aloke Mukherjee撰写&#xff0c;探讨了ChatGPT和Power BI在金融领域的应用。 主要特点&#xff1a; - 使用ChatGPT自动化Power BI&#xff…

工厂数字化解决方案

在数字化浪潮席卷全球的今天&#xff0c;工业4.0已不再是遥不可及的梦想&#xff0c;而是制造业转型升级的必由之路。面对日益激烈的市场竞争和消费者需求的快速变化&#xff0c;传统工厂如何借助数字化技术实现智能化、高效化、柔性化生产&#xff0c;成为了摆在每一个企业面前…

创新指南 | 企业AI战略实施方案探讨(下):如何基于AI重构业务流程并落地实施

人工智能&#xff08;AI&#xff09;的浪潮已经席卷全球&#xff0c;成为推动现代企业发展的强大动力。AI技术不仅提升了企业的运营效率&#xff0c;还催生了新的商业模式和市场机会。本文将深入探讨AI的革新性应用案例&#xff0c;并提供一套企业落地AI的具体实施方案&#xf…

一次tomcat闪退处理

双击tomcat目录下bin目录中startup.bat 在我的电脑上是一闪而过&#xff0c;不能正常地启动tomcat软件 以记事本打开startup.bat文件&#xff0c;在文件的结尾处加上pause 然后再双击该bat执行&#xff0c;此时窗口就不会关闭&#xff0c;并会将错误信息打印在提示框中 可能是…

信息系统项目管理师0601:项目立项管理 — 考点总结(可直接理解记忆)

点击查看专栏目录 项目立项管理 — 考点总结(可直接理解记忆) 1.项目建议书(又称立项申请)是项目建设单位向上级主管部门提交项目申请时所必须的文件,是对拟建项目提出的框架性的总体设想。在项目建议书批准后,方可开展对外工作(掌握)。 2.项目建议书应该包括的核心内…

绝地求生:PGS3参赛队伍跳点一览,17压力有点大,4AM与PeRo大概率不roll点

在PCL春季赛结束后&#xff0c;PGS3的参赛队伍名单以及分组就正式确定了&#xff0c;最后确定名额的DDT和NH被安排在了A组和B组&#xff0c;感觉这次PGS3的分组比较均衡&#xff0c;没有“死亡之组”一说。这段时间已经有网友汇总了PGS3队伍在各个地图的跳点&#xff0c;并且把…

总结!AI Agent开发的常见方法

全球首位AI程序员Devin诞生了&#xff0c;还是个全栈工程师&#xff0c;能够熟练进行云端部署、编写底层代码、改bug、甚至连训练和微调AI大模型都轻车熟路&#xff0c;说好的AI替代人类&#xff0c;难道先从程序员下手了&#xff1f; 实际上用AI打造程序员并不是那么新鲜的事情…