追蹤
兔子也會的遊戲設計
關於部落格
一個推廣XNA與OGRE的園地,當然還有其他關於遊戲設計的主題,歡迎有興趣的同好交流指教
  • 104833

    累積人氣

  • 0

    今日人氣

    0

    追蹤人氣

抽象工廠模式

假設今天我們要做的即時戰略遊戲兩方陣營兵種並不相同,以美國跟伊拉克為例,
雖然一樣都有工人、士兵等,但美國有美國的樣貌、說話方式、建築方式等,
伊拉克也一樣,所以我們的產品線擴大了,利用抽象工廠模式將其封裝起來,
至於是利用interface或是abstract不重要,重點就是產品線的延伸:

using System;

namespace AbstractFactory
{

    //抽象的建築物工廠 建築物可以製造美國以及伊拉克的單位
    public abstract class BuildFactory
    {   
        public abstract AmericanUnit CreateAmericanUnit();
        public abstract IraqUnit CreateIraqUnit();
    }

    //指揮中心 繼承建築物工廠
    public class CommandCenter : BuildFactory
    {
        public override AmericanUnit CreateAmericanUnit()
        {
            return new AmericanWorker();
        }
        public override IraqUnit CreateIraqUnit()
        {
            return new IraqWorker();
        }
    }

    //軍營 繼承建築物工廠
    public class Barrack : BuildFactory
    {
        public override AmericanUnit CreateAmericanUnit()
        {
            return new AmericanSoldier();
        }
        public override IraqUnit CreateIraqUnit()
        {
            return new IraqSoldier();
        }
    }


    //抽象美國單位   
    public abstract class AmericanUnit
    {
        public abstract void DoAmericanThing() ;
    }

    //抽象伊拉克單位   
    public abstract class IraqUnit
    {
        public abstract void DoIraqThing() ;
    }


    //美國工人 實作抽象美國單位
    public class AmericanWorker : AmericanUnit
    {
        public override void DoAmericanThing()
        {
            Console.WriteLine("I'm a AmericanWorker and I'm creating a building");
        }
    }

    //伊拉克工人 實作抽象伊拉克單位
    public class IraqWorker : IraqUnit
    {
        public override void DoIraqThing()
        {
            Console.WriteLine("I'm a IraqWorker and I'm creating a building");
        }
    }

    //美國士兵 繼承抽象美國單位
    public class AmericanSoldier : AmericanUnit
    {
        public override void DoAmericanThing()
        {
            Console.WriteLine("I'm a AmericanSoldier and I'm attacting a enmy");
        }
    }
    //伊拉克士兵 繼承抽象伊拉克單位
    public class IraqSoldier : IraqUnit
    {
        public override void DoIraqThing()
        {
            Console.WriteLine("I'm a IraqSoldier and I'm attacting a enmy");
        }
    }

    class Client
    {
        [STAThread]
        static void Pause()
        {
            Console.WriteLine("Press Enter To Continue....");
            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            //建了一個指揮中心
            BuildFactory building1 = new CommandCenter();
            //建立美國單位 至於是甚麼由指揮中心決定
            AmericanUnit unit1 = building1.CreateAmericanUnit();
            //生出來的單位做他自己的工作
            unit1.DoAmericanThing();
            //建立伊拉克單位 至於是甚麼由指揮中心決定
            IraqUnit unit2 = building1.CreateIraqUnit();
            //生出來的單位做他自己的工作
            unit2.DoIraqThing();

           
            //建了一個軍營
            BuildFactory building2 = new Barrack();
            //建立美國單位 至於是甚麼由軍營決定
            AmericanUnit unit3 = building1.CreateAmericanUnit();
            //生出來的單位做他自己的工作
            unit3.DoAmericanThing();
            //建立伊拉克單位 至於是甚麼由軍營決定
            IraqUnit unit4 = building1.CreateIraqUnit();
            //生出來的單位做他自己的工作
            unit4.DoIraqThing();
            Pause();
        }
    }

}

相簿設定
標籤設定
相簿狀態