Design Pattern (一) 工廠模式(Factory Pattern)_工廠模式

  • 549
  • 0
  • C#
  • 2019-10-18

工廠模式介紹,以訓練士兵的例子呈現

前言

上回我們了解到工廠模式的簡單工廠模式,由於簡單模式新增擴充時會修改到原始的程式碼,這樣就不符合物件導向程式設計的概念(英語:Object-oriented programming,縮寫:OOP) ,擴充新增封閉修改的概念,這次我們就介紹讀者另一種工廠模式,以訓練士兵的例子呈現

實作工廠模式

流程圖

1.建立一個虛擬的訓練營介面(interface)

interface Trainingcamp
{
    int Amount { get; } //生產總數
    character createcharacter(); //創造人物
}

2.建立人物的共同功能介面(interface)

interface character
{
    string Name { get; } //人物名稱
    void info(int amount); //人物資訊
    void skill(); //技能
    void skill2(); //技能2
}

3.把虛擬訓練營轉為實體

//弓箭手訓練營
class Archertrainingcamp:Trainingcamp
{
     int amount = 0; //產生人物總數
     public int Amount
     {
            get
            {
                return amount;
            }
     }
     //創建人物
     public character createcharacter()
     {
            amount++;
            return new Archer(amount);
     }
}
//戰士訓練營
class Warriortrainingcamp : Trainingcamp
{
      int amount = 0; //產生人物總數
      public int Amount
      {
            get
            {
                return amount;
            }
      }
      //創建人物
      public character createcharacter()
      {
          amount++;
          return new Warrior(amount);
      }
}

4.把人物共同介面功能實體

class Archer:character
{
       string name = "";//人物名稱
        public string Name
        {
            get
            {
                return name;
            }
        }
        //建構式
        public Archer(int amount)
        {
            name = "弓箭手" + amount;
        }
        //人物資訊
        public void info(int amount)
        {
            
            Console.WriteLine("數量:"+amount+" 職業為:弓箭手");
        }
        //技能
        public void skill()
        {
            Console.WriteLine(name + ":使用二連射");
        }
        //技能2
        public void skill2()
        {
            Console.WriteLine(name + ":使用箭雨");
        }
    }
    class Warrior : character
    {
        string name = "";//人物名稱
        public string Name
        {
            get
            {
                return name;
            }
        }
        //建構式
        public Warrior(int amount)
        {
            name = "戰士" + amount;
        }
        //人物資訊
        public void info(int amount)
        {
            name = "戰士" + amount;
            Console.WriteLine("數量:" + amount + " 職業為:戰士");
        }
        //技能
        public void skill()
        {
            Console.WriteLine(name+":使用十字斬");
        }
        //技能2
        public void skill2()
        {
            Console.WriteLine(name+":使用火焰斬");
        }
}

5.訓練營依使用者需求產出指定的人物

static void Main(string[] args)
{
    var archertrainingcamp = new Archertrainingcamp();//弓箭手訓練營生成
    var warriortrainingcamp = new Warriortrainingcamp();//戰士訓練營生成
    List<character> archert = new List<character>(); //弓箭手串列
    List<character> warrior = new List<character>(); //戰士串列
    archert.Add(archertrainingcamp.createcharacter()); //產出弓箭手
    archert.Add(archertrainingcamp.createcharacter());  //產出弓箭手
    warrior.Add(warriortrainingcamp.createcharacter()); //產出戰士
    archert[0].info(archertrainingcamp.Amount); //弓箭手資訊
    archert[0].skill(); //弓箭手使用技能
    archert[1].skill2();  //弓箭手使用技能
    warrior[0].info(warriortrainingcamp.Amount); //戰士資訊
    warrior[0].skill(); //戰士使用技能
    Console.ReadLine();
}

Export Result

結語

工廠模式改善了簡單工廠模式的擴充新增會改到原始碼的缺點,更符合物件導向設計的概念