IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【设计模式】Unity3D 简单工厂、工厂(方法)、抽象工厂模式 -> 正文阅读

[游戏开发]【设计模式】Unity3D 简单工厂、工厂(方法)、抽象工厂模式

创建型模式—工厂三兄弟

提示:个人学习总结,如有错误,敬请指正




提示:以下是本篇文章正文内容,下面案例可供参考

一、简单工厂模式

1.简单工厂模式是什么?

简单工厂的核心是:创建一个专门创建实例的类,一般来说创建的实例都拥有相同的父类或接口。

要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。


2.UML图

//TODO


3.实现方式

抽象产品:抽象类或者接口

public abstract class CubeBase 
{
    public abstract void GenerateCube();
}

具体产品:继承抽象产品,自定义实现

using UnityEngine;
public class BigCube : CubeBase
{
    public override void GenerateCube()
    {
        var gameobj =  GameObject.CreatePrimitive(PrimitiveType.Cube);
        gameobj.transform.localScale *= 2;
    }
}
using UnityEngine;
public class SmallCube : CubeBase
{
    public override void GenerateCube()
    {
        var gameobj = GameObject.CreatePrimitive(PrimitiveType.Cube);
        gameobj.transform.localScale *= 0.5f;
    }
}

工厂类:通过工厂类直接创建实例

using UnityEngine;
public class CubeFactory : MonoBehaviour
{
    public static CubeBase CubeGenerate(CubeCategory type)
    {
        CubeBase cube = null;
        switch (type)
        {
            case CubeCategory.big:
                cube = new BigCube();
                break;
            case CubeCategory.small:
                cube = new SmallCube();
                break;
            default:
                cube = null;
                break;
        }
        return cube;
    }
    public enum CubeCategory
    {
        big,
        small,
    }
}

客户端

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimpleFactoryEntary : MonoBehaviour
{
    CubeBase cubeBase;
    private void Start()
    {
        cubeBase = CubeFactory.CubeGenerate(CubeFactory.CubeCategory.big);
        cubeBase.GenerateCube();
    }
}


二、工厂(方法)模式

1.工厂(方法)模式是什么?

工厂(方法)模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例欧化延迟到其子类。

与简单工厂相比:不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。

简而言之,就是简单工厂的升级版,工厂方法实现时,客户端需要决定实例化哪一个工厂来实现生成产品,选择判断的问题还是存在的,也就是说工厂方法把简单工厂的内部逻辑判断转移到了客户端,你要加功能,本来是改工厂类,现在是修改客户端


2.UML图

//TODO


3.实现方式

工厂接口:

interface IFactory
{
    CubeBase CreateCube();
}

具象工厂:

public class SpheresFactory : IFactory
{
    public ShapeBase CreateFactory()
    {
        return new Spheres();
    }
}
public class CubesFactory : IFactory
{
    public ShapeBase CreateFactory()
    {
        return new Cubes();
    }
}

抽象产品

public abstract class ShapeBase 
{
    public abstract void GenerateShape();
}

具体产品

using UnityEngine;
public class Cubes : ShapeBase
{
    public override void GenerateShape()
    {
        GameObject.CreatePrimitive(PrimitiveType.Cube);
    }
}
using UnityEngine;
public class Spheres : ShapeBase
{
    public override void GenerateShape()
    {
        GameObject.CreatePrimitive(PrimitiveType.Sphere);
    }
}

客户端:

using UnityEngine;
public class FactoryEntary : MonoBehaviour
{
    void Start()
    {
        //修改 CubesFactory 即可
        IFactory factory = new CubesFactory();
        var cube =  factory.CreateFactory();
        cube.GenerateShape();
    }
}


三.抽象工厂模式

1.抽象工厂模式是什么?

抽象工厂模式(AbstrucFactory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。

工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。它只是工厂模式的一个扩展,若其只有一个产品体系则变成工厂模式


2.UML图

//TODO


3.实现方式

产品接口:抽象产品

//抽象Cube产品
interface IACube 
{
    void Generate();
}

//抽象Sphere产品
interface IASphere
{
    void Generate();
}

具体产品

public class ABigCube : IACube
{
    public void Generate()
    {
        var gameobj = GameObject.CreatePrimitive(PrimitiveType.Cube);
        gameobj.transform.localScale *= 2f;
    }
}
using UnityEngine;
public class ASmallCube : IACube
{
    public void Generate()
    {
        var gameobj = GameObject.CreatePrimitive(PrimitiveType.Cube);
        gameobj.transform.localScale *= 0.5f;
    }
}
using UnityEngine;
public class ASmallSphere : IASphere
{
    public void Generate()
    {
        var gameobj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        gameobj.transform.localScale *= 0.5f;
    }
}
using UnityEngine;
public class ABigSphere : IASphere
{
    public void Generate()
    {
        var gameobj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        gameobj.transform.localScale *= 2f;
    }
}

抽象工厂

interface AbstructFactory 
{
    IACube CreateCube();
    IASphere CreateSphere();
}

具体工厂

class AFactoryOne : AbstructFactory
{
    public IACube CreateCube()
    {
        return new ABigCube();
    }

    public IASphere CreateSphere()
    {
        return new ABigSphere();
    }
}
class AFactoryTwo : AbstructFactory
{
    public IACube CreateCube()
    {
        return new ASmallCube();
    }

    public IASphere CreateSphere()
    {
        return new ASmallSphere();
    }
}

客户端

using UnityEngine;

public class AbstructFactoryEntary : MonoBehaviour
{
    private void Start()
    {
        AbstructFactory factory = new AFactoryOne();
        var a = factory.CreateCube();
        var b = factory.CreateSphere();
        a.Generate();
        b.Generate();
    }
}


四、三者的异同

//TODO


五、三者的优缺点

//TODO


六、三者的适用场景

//TODO

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:26:54  更:2022-04-29 12:29:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:03:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码