工廠模式介紹,以訓練士兵的例子呈現
前言
上回我們了解到工廠模式的簡單工廠模式,由於簡單模式新增擴充時會修改到原始的程式碼,這樣就不符合物件導向程式設計的概念(英語: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
結語
工廠模式改善了簡單工廠模式的擴充新增會改到原始碼的缺點,更符合物件導向設計的概念