Unity 工厂方法模式(实例详解)

文章目录


在Unity中,工厂方法模式是一种创建对象的常用设计模式,它提供了一个接口用于创建对象,而具体的产品类是由子类决定的。这样可以将对象的创建过程与使用过程解耦,使得代码更加灵活和可扩展。
工厂模式的主要优点如下:

  1. 封装创建过程:工厂模式将对象的创建过程封装在一个单独的类(即工厂类)中,客户端无需知道如何创建具体的产品对象,只需调用工厂类的方法即可获取所需产品。

  2. 分离接口和实现:通过工厂模式,可以将产品的抽象接口与其实现细节分离开来。客户端代码仅依赖于抽象产品接口,而不直接依赖于具体的产品实现,这样有助于降低耦合度。

  3. 易于扩展和修改:当需要添加新的产品类型时,只需要增加一个新的产品类并修改工厂类的逻辑,而不需要修改使用这些产品的客户端代码。这遵循了“开闭原则”——对扩展开放,对修改关闭。

  4. 支持多种产品族:如果系统中有多系列产品需要根据条件动态生成不同的实例,工厂模式可以很好地处理这种情况,使得不同系列的产品能够共用一个创建逻辑。

  5. 便于单元测试:在测试环境中,可以通过替换工厂类为模拟版本(Mock Object),轻松地创建测试数据,进而对依赖对象的行为进行控制和验证。

  6. 控制复杂对象的创建:对于构造参数多、构造过程复杂的对象,工厂方法可以把这部分逻辑集中起来管理,避免在各处重复编写相同的创建逻辑。

总之,工厂模式提高了软件系统的灵活性、可扩展性和可维护性,在设计阶段就能更好地预见和应对未来的需求变化。
假设我们有三个装备类型(武器、护甲)和三种职业角色(战士、法师、盗贼),下面是完整的C#代码:

using System.Collections.Generic;

public enum ProfessionType
{
    Warrior,
    Mage,
    Rogue
}

// 抽象角色类
public abstract class Character
{
    public string Name { get; set; }
    public ProfessionType Profession { get; protected set; }
    public List<Equipment> Equipment { get; set; }

    // 其他通用属性和方法...
}

// 抽象装备基类
public abstract class Equipment
{
    public string Name { get; set; }
}

// 武器类
public class Weapon : Equipment
{
    public int AttackPower { get; set; }
}

// 盔甲类
public class Armor : Equipment
{
    public int DefenseRating { get; set; }
}

// 角色工厂类
public static class CharacterFactory
{
    public static Character CreateCharacter(ProfessionType profession)
    {
        switch (profession)
        {
            case ProfessionType.Warrior:
                return new Warrior();
            case ProfessionType.Mage:
                return new Mage();
            case ProfessionType.Rogue:
                return new Rogue();
            default:
                throw new ArgumentException("Invalid profession type");
        }
    }

    public static List<Equipment> CreateInitialEquipment(ProfessionType profession)
    {
        switch (profession)
        {
            case ProfessionType.Warrior:
                return new List<Equipment>
                {
                    new Weapon() { Name = "新手剑", AttackPower = 30 },
                    new Armor() { Name = "铁甲", DefenseRating = 50 }
                };
            case ProfessionType.Mage:
                return new List<Equipment>
                {
                    new Weapon() { Name = "魔法杖", AttackPower = 20, MagicPower = 40 },
                    new Armor() { Name = "学者袍", DefenseRating = 30, MagicDefense = 60 }
                };
            case ProfessionType.Rogue:
                return new List<Equipment>
                {
                    new Weapon() { Name = "短剑", AttackPower = 25, CritChance = 15 },
                    new Armor() { Name = "皮甲", DefenseRating = 40, AgilityBonus = 10 }
                };
            default:
                throw new ArgumentException("Invalid profession type for equipment creation");
        }
    }
}

// 战士角色类
public class Warrior : Character
{
    public Warrior()
    {
        this.Profession = ProfessionType.Warrior;
        this.Equipment = CharacterFactory.CreateInitialEquipment(this.Profession);
    }
    
    // ...
}

// 法师角色类
public class Mage : Character
{
    public Mage()
    {
        this.Profession = ProfessionType.Mage;
        this.Equipment = CharacterFactory.CreateInitialEquipment(this.Profession);
    }
    
    // ...
}

// 盗贼角色类
public class Rogue : Character
{
    public Rogue()
    {
        this.Profession = ProfessionType.Rogue;
        this.Equipment = CharacterFactory.CreateInitialEquipment(this.Profession);
    }
    
    // ...
}

现在你可以在项目中通过 CharacterFactory 来创建不同职业的角色,并为他们分配初始装备。当需要添加新职业或调整装备配置时,只需修改工厂类的相关逻辑即可。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

  • 30
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity中的工厂模式是一种常见的设计模式,它用于创建对象实例而无需暴露其创建逻辑。其核心思想是将对象的创建委托给一个单独的工厂类,从而将创建代码与使用代码分离开来。在Unity中,工厂模式常用于创建游戏对象、组件、材质等。 下面是一个简单的Unity工厂模式的示例: ```csharp public enum ObjectType { Player, Enemy, Item } public class ObjectFactory { public GameObject CreateObject(ObjectType type) { GameObject prefab = null; switch (type) { case ObjectType.Player: prefab = Resources.Load<GameObject>("Prefabs/Player"); break; case ObjectType.Enemy: prefab = Resources.Load<GameObject>("Prefabs/Enemy"); break; case ObjectType.Item: prefab = Resources.Load<GameObject>("Prefabs/Item"); break; } return Object.Instantiate(prefab); } } ``` 在上面的示例中,我们定义了一个`ObjectType`枚举来标识需要创建的对象类型。然后我们创建了一个`ObjectFactory`类,其中包含一个`CreateObject`方法,该方法根据传入的对象类型创建相应的游戏对象。在该方法中,我们使用`Resources.Load`方法加载相应的预制件,并使用`Object.Instantiate`方法创建新的游戏对象。 使用工厂模式的好处是,当我们需要创建新的游戏对象时,只需调用`ObjectFactory`类的`CreateObject`方法,并传入相应的对象类型即可,而无需了解其创建过程。这样可以使我们的代码更加模块化和可维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极致人生-010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值