前言
当我们项目中的代码越来越多时,就会出现一些复杂程度上或是代码逻辑上的问题,这时候就需要用一些固定的解决方案来帮助我们解决问题。这些解决方案不仅可以解决代码框架结构的问题,而且可以很好的降低代码之间的耦合度。这些解决方案就是设计模式。而工厂模式就是设计模式中的一种。
一、啥子是抽象工厂模式?
通过定义一个接口,让子类决定实例化哪一类,让类的实例化延迟到子类中进行,这就是抽象工厂模式。抽象工厂模式提供了一种创建多种类型的对象的方式
二、注意看!这有个非抽象工厂者与抽象工厂的对比!
试想一下,在RTS游戏中,我们可能要造战士,骑士,弓箭手等不同的角色去进行游戏,对于我们来说,我们只需要发出对应指令,就能获得对应兵种。我们以此为例来探讨下两种方式的不同。
以下是两种方式的实现。
非抽象工厂模式代码
让我们来瞅瞅非抽象工厂模式的代码
using UnityEngine;
public abstract class Soldiers
{
public abstract void Spawn();
}
public class Infantry : Soldiers
{
public override void Spawn()
{
Debug.Log("生成步兵!");
}
}
public class Cavalry : Soldiers
{
public override void Spawn()
{
Debug.Log("生成骑兵!");
}
}
public class Bow : Soldiers
{
public override void Spawn()
{
Debug.Log("生成弓兵!");
}
}
public class AbstractFactory : MonoBehaviour
{
void Start()
{
Infantry infantry = new Infantry();
Cavalry cavalry = new Cavalry();
Bow bow = new Bow();
infantry.Spawn();
cavalry.Spawn();
bow.Spawn();
}
}
在上段代码中,我们创建了3个士兵对象。在这种方式中,如果士兵的类型越来越多,那么该方式就不太方便了。
抽象工厂模式代码
为了避免上述情况, 我们的抽象工厂模式就来了!
using UnityEngine;
public abstract class Soldiers
{
public abstract void Spawn();
}
public class Infantry : Soldiers
{
public override void Spawn()
{
Debug.Log("生成步兵!");
}
}
public class Cavalry : Soldiers
{
public override void Spawn()
{
Debug.Log("生成骑兵!");
}
}
public class Bow : Soldiers
{
public override void Spawn()
{
Debug.Log("生成弓兵!");
}
}
//士兵枚举
public enum SoldierType
{
Infantry,
Cavalry,
Bow
}
//士兵工厂类
public class SoldiersFactory
{
//创建士兵对象的方法
public static Soldiers Create(SoldierType type)
{
Soldiers soldiers = null;
switch (type)
{
case SoldierType.Infantry:
soldiers = new Infantry();
break;
case SoldierType.Cavalry:
soldiers = new Cavalry();
break;
case SoldierType.Bow:
soldiers = new Bow();
break;
}
return soldiers;
}
}
public class AbstractFactory : MonoBehaviour
{
void Start()
{
Soldiers infantry = SoldiersFactory.Create(SoldierType.Infantry);
infantry.Spawn();
Soldiers cavalry = SoldiersFactory.Create(SoldierType.Cavalry);
cavalry.Spawn();
Soldiers bow = SoldiersFactory.Create(SoldierType.Bow);
bow.Spawn();
}
}
抽象工厂模式在创建对象时,由于类得实例化过程已经被隐藏起来了,因此使用了统一的创建方法。这样当类型数量过多时,使用起来会十分方便,并且具有很好的拓展性,可以随时对封装的类进行修改或添加。
三、如何使用抽象工厂模式
使用抽象工厂模式的大概思路为下:
1:创建抽象类 (上文中的 Soldiers 类)
2:创建多个类继承自抽象类(上文中的I, Npc, Gamer类继承了Character)
3:创建一个被观察的主体(上文中的 observerSubject 类)
4:在满足对应条件下通过被观察主体向观察者发消息,使观察者调用对应方法。
总结
合理的使用观察者模式,可以有效降低我们代码的耦合性,同时也有利于后期进行修改!(本篇文章若有错误,欢迎指正!)

本文介绍了抽象工厂模式的概念及其与非抽象工厂模式的区别。通过RTS游戏的例子,展示了如何使用抽象工厂模式创建不同类型的士兵,如步兵、骑兵和弓箭手。抽象工厂模式在代码组织和拓展性方面具有优势,降低了代码耦合度,便于后期维护和扩展。

被折叠的 条评论
为什么被折叠?



