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里加载,或者从对象池里加载。等等因素实际情况还是要复杂的多。

  • 相关阅读:
    php ajax 表格排序,调整列宽,修改内容
    Jquery隐藏式评论
    还是一个鼠标点击td变成input,失去焦点更新数据库
    Jquery php 点击td变成input,修改后失去焦点发送数据
    hdu 1713 相遇周期 比较绕的最大公约,最小公倍问题
    hdu 1722 Cake (抽象出欧几里得)
    提供Webservice的地方
    实现汉字转拼音
    java 注解
    c#获取汉字的拼音首字母
  • 原文地址:https://www.cnblogs.com/space1996/p/13721812.html
Copyright © 2011-2022 走看看