C# x Unity 设计模式 之 工厂模式 (一步步写出一个怪物生产厂)

工厂模式介绍

实际上就是下图的模式

实现思路分析

首先,工厂模式是一个类

其次,工厂模式的最大特点就是不要去从外部new(实例化),而是通过工厂去实例化对象

比如我需要三个类对象,分别是哥布林,巨魔和史莱姆,那么就可以创建一个怪物工厂,从工厂中去创建实例,然后拿去用

那么思路就清晰了

1.定义一个怪物接口,以实现怪物通用逻辑

public interface Enemy
{
    void Attack();
    void Dead();
}

之后创建怪物类并实现接口

public class Slime : Enemy {
    public void Attack() {
        Debug.Log("");
    }
    void Enemy.Dead() {   
    }
}
public class Goblin : Enemy {
    public void Attack() {
    }
    void Enemy.Dead() {
    }
}
public class Troll : Enemy {
    public void Attack() {
    }
    void Enemy.Dead() {
    }
}

2.创建一个怪物工厂类 

注意,我们应该有一种判断怪物类型的标识,可以是字符串,也可以是枚举,那我就使用枚举了

public enum E_Enemy {
    Slime,
    //下面可以自行添加敌人类型
    Goblin,
    Troll
}

传进来枚举变量对应就返回实例即可,如果你这个工厂想要唯一实现,那么可以写作单例模式

public class SingleBase<T> where T : new() {

    private static T instance = new T() ;
    public static T Instance => instance;  
}

 泛型单例模式基类,将继承的类做单例模式处理

 class Factory:SingleBase<Factory>
    {
    public  Enemy CreateEnemy(E_Enemy e_Enemy)
        {
        switch (e_Enemy) {
            case E_Enemy.Slime:
                return new Slime();
            case E_Enemy.Goblin:
                return new Goblin();
            case E_Enemy.Troll:
                return new Troll(); 
            default:
                break;
        }
        return null;
    }
}

3.使用方法

外部传入枚举后,创建一个新的类(Test),直接调用工厂方法调用即可

public class Test : MonoBehaviour
{
    E_Enemy Enemy;
    // Start is called before the first frame update
    void Start()
    {
        Enemy = E_Enemy.Goblin;
        Enemy enemy = Factory.Instance.CreateEnemy(Enemy);
        enemy?.Attack();
    }}

代码总览

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public enum E_Enemy {
    Slime,
    //下面可以自行添加敌人类型
    Goblin,
    Troll
}

public interface Enemy
{
    void Attack();
    void Dead();
}

public class Slime : Enemy {
    public void Attack() {
        Debug.Log("");
    }
    void Enemy.Dead() {   
    }
}
public class Goblin : Enemy {
    public void Attack() {
    }
    void Enemy.Dead() {
    }
}
public class Troll : Enemy {
    public void Attack() {
    }
    void Enemy.Dead() {
    }
}
 class Factory:SingleBase<Factory>
    {
    public  Enemy CreateEnemy(E_Enemy e_Enemy)
        {
        switch (e_Enemy) {
            case E_Enemy.Slime:
                return new Slime();
            case E_Enemy.Goblin:
                return new Goblin();
            case E_Enemy.Troll:
                return new Troll(); 
            default:
                break;
        }
        return null;
    }
}

怎么样,是不是非常简单,在次基础上你可以有更多接口,更多工厂 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值