Unity工厂模式

什么是工厂模式?
        工厂是一种创建型设计模式。通俗来讲就是提供一种封装对象创建的方式,将对象的创建和使用区分开。就是Unity里面通常用到的创建和管理对象。

工厂模式有什么优点?
        1、封装对象的创建方式,使其更加灵活、易于管理、可扩展、可维护,降低代码的耦合性。

        2、提供一种统一的对象创建方式,代码解读更加容易懂、逻辑更加清晰。

        3、可以根据不同的需求创建不同的对象。

简单工厂模式

定义:简单工厂模式,也称为静态工厂方法,是通过一个静态方法,根据传入的参数决定创建哪一个具体类的实例。

优点

  • 易于理解和实现。
  • 集中管理对象的创建过程。

缺点

  • 工厂类容易变得臃肿,不易维护。
  • 增加新的产品需要修改工厂类,不符合开闭原则(对扩展开放,对修改关闭)。
// 产品接口
public interface IProduct
{
    void Use();
}

// 具体产品A
public class ConcreteProductA : IProduct
{
    public void Use()
    {
        Debug.Log("Using Product A");
    }
}

// 具体产品B
public class ConcreteProductB : IProduct
{
    public void Use()
    {
        Debug.Log("Using Product B");
    }
}

// 简单工厂类
public static class SimpleFactory
{
    public static IProduct CreateProduct(string type)
    {
        switch (type)
        {
            case "A":
                return new ConcreteProductA();
            case "B":
                return new ConcreteProductB();
            default:
                throw new ArgumentException("Invalid product type");
        }
    }
}

工厂方法模式

定义:工厂方法模式定义一个用于创建对象的接口,但由子类决定实例化哪一个类。工厂方法模式让类的实例化推迟到子类。

优点

  • 遵循开闭原则,增加新产品时不需要修改已有的工厂类。
  • 更符合面向对象设计原则,易于扩展和维护。

缺点

         

缺点:增加了系统的抽象性和复杂性。

  • 增加了代码的复杂度,需要创建额外的工厂类。
    // 产品接口
    public interface IProduct
    {
        void Use();
    }
    
    // 具体产品A
    public class ConcreteProductA : IProduct
    {
        public void Use()
        {
            Debug.Log("Using Product A");
        }
    }
    
    // 具体产品B
    public class ConcreteProductB : IProduct
    {
        public void Use()
        {
            Debug.Log("Using Product B");
        }
    }
    
    // 抽象工厂接口
    public interface IFactory
    {
        IProduct CreateProduct();
    }
    
    // 具体工厂A
    public class ConcreteFactoryA : IFactory
    {
        public IProduct CreateProduct()
        {
            return new ConcreteProductA();
        }
    }
    
    // 具体工厂B
    public class ConcreteFactoryB : IFactory
    {
        public IProduct CreateProduct()
        {
            return new ConcreteProductB();
        }
    }
    
    // 客户端代码
    public class Client : MonoBehaviour
    {
        void Start()
        {
            IFactory factoryA = new ConcreteFactoryA();
            IFactory factoryB = new ConcreteFactoryB();
    
            IProduct productA = factoryA.CreateProduct();
            IProduct productB = factoryB.CreateProduct();
    
            productA.Use();
            productB.Use();
        }
    }

    抽象工厂模式

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

  • 优点

  • 提供了一种方式将一组相关或依赖的对象一起创建。
  • 符合开闭原则和单一职责原则。
    // 产品A接口
    public interface IProductA
    {
        void Use();
    }
    
    // 产品B接口
    public interface IProductB
    {
        void Display();
    }
    
    // 具体产品A1
    public class ConcreteProductA1 : IProductA
    {
        public void Use()
        {
            Debug.Log("Using Product A1");
        }
    }
    
    // 具体产品A2
    public class ConcreteProductA2 : IProductA
    {
        public void Use()
        {
            Debug.Log("Using Product A2");
        }
    }
    
    // 具体产品B1
    public class ConcreteProductB1 : IProductB
    {
        public void Display()
        {
            Debug.Log("Displaying Product B1");
        }
    }
    
    // 具体产品B2
    public class ConcreteProductB2 : IProductB
    {
        public void Display()
        {
            Debug.Log("Displaying Product B2");
        }
    }
    
    // 抽象工厂接口
    public interface IAbstractFactory
    {
        IProductA CreateProductA();
        IProductB CreateProductB();
    }
    
    // 具体工厂1
    public class ConcreteFactory1 : IAbstractFactory
    {
        public IProductA CreateProductA()
        {
            return new ConcreteProductA1();
        }
    
        public IProductB CreateProductB()
        {
            return new ConcreteProductB1();
        }
    }
    
    // 具体工厂2
    public class ConcreteFactory2 : IAbstractFactory
    {
        public IProductA CreateProductA()
        {
            return new ConcreteProductA2();
        }
    
        public IProductB CreateProductB()
        {
            return new ConcreteProductB2();
        }
    }
    
    // 客户端代码
    public class Client : MonoBehaviour
    {
        void Start()
        {
            IAbstractFactory factory1 = new ConcreteFactory1();
            IAbstractFactory factory2 = new ConcreteFactory2();
    
            IProductA productA1 = factory1.CreateProductA();
            IProductB productB1 = factory1.CreateProductB();
            IProductA productA2 = factory2.CreateProductA();
            IProductB productB2 = factory2.CreateProductB();
    
            productA1.Use();
            productB1.Display();
            productA2.Use();
            productB2.Display();
        }
    }
    

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值