設計模式之抽象方法
阿新 • • 發佈:2020-09-23
結構圖如上:
我用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 classJapanPlane : 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方法;
只是照貓畫虎的使用了這個模式,在實際開發中實現估計會更復雜,要考慮更多因素。