设计模式之抽象方法
结构图如上:
我用RTS游戏里的例子来套用下这个结构:假如现在要开发一款二战题材及时对战游戏,游戏里包括美国和日本两个势力,游戏开始:选择美国势力的玩家在地图上建造了一个兵工厂(UsaFactory类)用来生产美军攻击单位例如坦克(UsaTank类),美军战斗机(UsaPlane),选择日本势力的玩家开局也选择建造一个兵工厂(JapannFactoy类),可以生产日本坦克(JapanTank类),日本战斗机(JapnePlane类)。我们将这些类设计成上面的那样:
之后贴出实现代码:
//abstract Products public abstract class AirPlane { public abstract void Fly(); } public abstract class Tank { public abstract void Move(); } //abstract factory,可以理解成工厂里的生产线 //不同的生产线所生产的产品不同 public abstract class ProductionLine { public abstract AirPlane CreatePlane(); public abstract Tank CreateTank(); } //Concreate products public class JapanPlane : AirPlane { public override void Fly() { Debug.Log("Japan plane flying"); } } public class UsaPlane : AirPlane { public override void Fly() { Debug.Log("america plane flying"); } } public class JapanTank : Tank { public override void Move() { Debug.Log("Japan tank moving"); } } public class UsaTank : Tank { public override void Move() { Debug.Log("USA tank moving"); } } //Concreate Factory public class JapanFactory : ProductionLine { public override AirPlane CreatePlane() { return new JapanPlane(); } public override Tank CreateTank() { return new JapanTank(); } } public class UsaFactory : ProductionLine { public override AirPlane CreatePlane() { return new UsaPlane(); } public override Tank CreateTank() { return new UsaTank(); } }
我们简单测试下改如何使用:
两个OnClicked方法用UGUI的button绑定起来
public class TestA : MonoBehaviour { UsaFactory usaFactory; JapanFactory japanFactory; private void Awake() { usaFactory = new UsaFactory(); japanFactory = new JapanFactory(); } public void OnClickedUSA() { usaFactory.CreatePlane().Fly(); usaFactory.CreateTank().Move(); } public void OnClickedJapan() { japanFactory.CreateTank().Move(); japanFactory.CreatePlane().Fly(); } }
运行结果:点击USA按钮生成一个UsaPlane对象并调用Fly方法,生成一个UsaTank对象并调用Move方法;
点击Japan按钮生成一个JapanPlane对象并调用Fly方法,生成一个JapanTank对象并调用Move方法;
只是照猫画虎的使用了这个模式,在实际开发中实现估计会更复杂,要考虑更多因素。