设计模式之抽象方法

 

 结构图如上:

我用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方法;

 只是照猫画虎的使用了这个模式,在实际开发中实现估计会更复杂,要考虑更多因素。

posted @ 2020-09-23 21:14  丝袜骑士  阅读(188)  评论(0编辑  收藏  举报