zoukankan      html  css  js  c++  java
  • 设计模式之工厂方法

    我们用RTS游戏举例套用这个模式:

    假如策划把建造单位分为:

    军营(MeleeUnitCreator)可以生产近战单位(MeleeUnit类),近战单位有低级士兵(LowLevelSoldier),中级士兵(NormalLevelSoldier),高级士兵(HighLevelSoldier)

    神机营可以生产远程单位,远程单位有低级铁炮手,中级铁炮手,大炮。等等类推。在这里我们只实现一个。我们将上面的类用工厂方法的结构设计起来:

    具体实现代码:

    //productes
    public abstract class Unit
    {
        //略。。。。。
    }
    
    public abstract class MeleeUnit:Unit
    {
        public abstract void Melee();
    }
    
    public class LowLevelSoldier : MeleeUnit
    {
        public override void Melee()
        {
            Debug.Log("低级士兵使用短剑攻击");
        }
    }
    public class NormalLevelSoldier : MeleeUnit
    {
        public override void Melee()
        {
            Debug.Log("中级士兵使用长剑攻击");
        }
    }
    
    public class HighLevelSoldier : MeleeUnit
    {
        public override void Melee()
        {
            Debug.Log("高级士兵使用巨剑攻击");
        }
    }
    //creator:
    public interface ICreator
    {
        T Create<T>() where T : Unit,new();
    }
    
    public class MeleeUnitCreator : ICreator
    {
        public T Create<T>() where T : Unit,new()
        {
            return new T();
        }
    }

    最终测试下该如何使用:

    public  class TestA : MonoBehaviour
    {
        //TODO:工厂方法
        //AbstractProduct类----近战单位
        //ConcreateProduct类---低级士兵,中级士兵,高级士兵
        //AbstractCreator类或接口---定义生产单位的抽象方法
        //ConcreateCreator类---军营(实现具体生产方法)
    
        private void Start()
        {
            //生成一个兵工厂
            MeleeUnitCreator creator = new MeleeUnitCreator();
    
            //兵工厂生产一个低级士兵,并让他攻击
            creator.Create<LowLevelSoldier>().Melee();
            //兵工厂生产一个中级士兵,并让他攻击
            creator.Create<NormalLevelSoldier>().Melee();
            //兵工厂生产一个高级士兵,并让他攻击
            creator.Create<HighLevelSoldier>().Melee();
        }
    
    }

    测试结果为:

    总结:定义一个可以产生对象的接口,但是让子类决定要产生哪一个类的对象。工厂方法模式让类的实例化程序延迟到子类中实施(ps:让子类决定要产生哪一个类的对象是通过泛型实现的)

    又是照猫画虎的按照结构图中规中矩的实现了,但是考虑实际开发时,LowLevelSolider等类要挂在GO上,制作成Prefabs,在实际创建他时从Resources里加载,或者从对象池里加载。等等因素实际情况还是要复杂的多。

  • 相关阅读:
    练习与突破
    HTML input type=file文件选择表单的汇总(一)
    webpack学习之—— Configuration(配置)
    webpack学习之—— Plugins
    webpack学习之—— Loaders
    webpack学习之——Output
    webpack学习之——Entry Points(入口起点)
    CSS3 3D transform变换
    get和post请求的区别
    日期格式之——剩余时间(天,小时,分,秒)的计算方法
  • 原文地址:https://www.cnblogs.com/space1996/p/13721812.html
Copyright © 2011-2022 走看看