Unity 游戏设计模式:工厂模式

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

工厂模式是一种创建型设计模式,它提供了一种封装对象实例化过程的方式,使得客户端代码与具体类的实现解耦。

在 C# 的游戏设计中,模式有以下作用:

对象的创建与使用分离: 单工厂模式将对象的创建过程放在一个单独的工厂类中,使得客户端代码不直接依赖于具体的类实现。客户端只需要通过工厂类来创建对象,而不需要了解对象的具体实现细节。

易于扩展: 如果需要添加新的游戏元素或功能,只需要修改工厂类,而不需要修改客户端代码。这使得系统更加灵活,易于扩展和维护。

代码复用: 工厂模式可以在多个地方共享,以确保对象的一致性创建。这有助于减少重复的代码,提高代码的可维护性。

降低耦合度: 客户端代码不需要直接知道如何创建对象,只需通过工厂类来获取所需的对象。这降低了系统中各个类之间的耦合度,使得系统更易于理解和维护。

工厂模式用于创建对象实例,例如创建不同类型的敌人(Enemy)或武器(Weapon)。

分为:简单工厂模式,工厂方法模式,抽象工厂模式

优点:

1. 简单工厂模式

需要创建的对象类:

c# 复制代码
//游戏对象类
interface IGameObject
{
    void LogMe();
}
//让游戏对象继承此接口,这样就可以使用接口装载各种对象
class Enemy : IGameObject
{
    public void LogMe()
    {
        Console.WriteLine("我是敌人");
    }
}
class Player : IGameObject
{
    public void LogMe()
    {
        Console.WriteLine("我是玩家");
    }
}
class Goods : IGameObject
{
    public void LogMe()
    {
        Console.WriteLine("我是商品");
    }
}

下面为简单工厂类

c# 复制代码
    //创建一个接口表示游戏对象
    //也可以创建一个类,但方法记得要写virtual和override不然表现不了多态

//创建简单工厂类
class GameObjectFactory
{
    //实现在工厂创建对象的方法并返回
    public static IGameObject CreateItem(string name)
    {
        switch (name)
        {
            case "Enemy":
                return new Enemy();
            case "Player":
                return new Player();
            case "Goods":
                return new Goods();
            default:
                throw new ArgumentException($"无效的对象名: {name}");
        }

    }
}
    class Program
    {
        static void Main(string[] args)
        {
            //调用工厂类创建对象
            IGameObject enemy = GameObjectFactory.CreateItem("Enemy");
            IGameObject player = GameObjectFactory.CreateItem("Player");
            IGameObject goods = GameObjectFactory.CreateItem("Goods");
            enemy.LogMe();
            player.LogMe();
            goods.LogMe();
        }
    }

2. 工厂方法模式

工厂方法模式是对简单工厂模式进一步的解耦,在工厂方法模式中是 "一类产品对应一个工厂类"

而这些工厂类都继承于一个抽象工厂。这相当于是把原本会随着业务扩展而庞大的简单工厂类,拆分成了一个个的具体产品工厂类,这样代码就不会都耦合在同一个类里。

c# 复制代码
interface IFactory
{
    IGameObject CreateGameObject();
}
//敌人工厂
class EnmyFactory : IFactory
{
    public IGameObject CreateGameObject()
    {
        return new Enemy();
    }
}
//玩家工厂
class PlayerFactory : IFactory
{
    public IGameObject CreateGameObject()
    {
        return new Player();
    }
}
//使用:
    IFactory enemyFactory = new EnmyFactory();//创建敌人工厂
    IGameObject enemy = enemyFactory.CreateGameObject();//通过敌人工厂创建敌人
    IFactory playerFactory = new PlayerFactory();//创建玩家工厂
    IGameObject player = playerFactory.CreateGameObject();//通过玩家工厂创建玩家

3. 抽象工厂模式

抽象工厂模式是工厂方法模式的加强版,抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对一个产品对应一个工厂类,而抽象工厂模式面对多个产品对应一个工厂类,一个工厂角色可以负责多个不同产品等级结构中的产品对象的创建 。

c# 复制代码
//在上面的游戏对象类在加一些
//不同敌人类
    class BigEnemy : IGameObject
    {
        public void LogMe()
        {
            Console.WriteLine("我是大敌人");
        }
    }
    class SmallEnemy : IGameObject
    {
        public void LogMe()
        {
            Console.WriteLine("我是小敌人");
        }
    }
//不同玩家类
    class BigPlayer : IGameObject
    {
        public void LogMe()
        {
            Console.WriteLine("我是大玩家");
        }
    }
    class SmallPlayer : IGameObject
    {
        public void LogMe()
        {
            Console.WriteLine("我是小玩家");
        }
    }

以下为抽象工厂类:

c# 复制代码
interface IFactory
{
    IGameObject CreateBigOne();
    IGameObject CreateSmallOne();
}
//创建敌人工厂
class EnemyFactory : IFactory
{
    public IGameObject CreateBigOne()
    {
        return new BigEnemy();
    }

    public IGameObject CreateSmallOne()
    {
        return new SmallEnemy();
    }
}
//创建玩家工厂
class PlayerFactory : IFactory
{
    public IGameObject CreateBigOne()
    {
        return new BigPlayer();
    }

    public IGameObject CreateSmallOne()
    {
        return new SmallPlayer();
    }
}
//使用
    IFactory enemyFactory = new EnemyFactory();//创建敌人工厂
    IGameObject bigEnemy = enemyFactory.CreateBigOne();
    IGameObject smallEnemy = enemyFactory.CreateSmallOne();
    IFactory playerFactory = new PlayerFactory();//创建玩家工厂
    IGameObject bigPlayer = playerFactory.CreateBigOne();
    IGameObject smallPlayer = playerFactory.CreateSmallOne();
相关推荐
小白不太白9509 分钟前
设计模式之 观察者模式
观察者模式·设计模式
九州ip动态1 小时前
做网络推广及游戏注册为什么要换IP
网络·tcp/ip·游戏
小白不太白9501 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in2 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in2 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
闲人一枚(学习中)2 小时前
设计模式-创建型-原型模式
设计模式
Iced_Sheep2 小时前
干掉 if else 之策略模式
后端·设计模式
哪 吒10 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_102210 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
向宇it12 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎