C#實(shí)現(xiàn)簡單工廠模式
情景:有一個(gè)怪獸,HP是100,現(xiàn)在勇士有可以使用武器將其打敗,有三種武器,木劍每次打擊20血,鐵劍每次50血,金剛劍每次100血,如果想要使用簡單工廠方式,怎么設(shè)計(jì)?
一.啥是簡單工廠?
通過專門定義一個(gè)類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。
結(jié)構(gòu)大概如下圖:

畫出場景的類圖

解釋:
- 1.Sword是一個(gè)基類,通過其中有一個(gè)字段保存怪物的血量,還有一個(gè)虛方法是打擊怪物的方法
- 2.有三個(gè)具體的武器的類,分別對應(yīng)木劍、鐵劍、金剛劍,實(shí)現(xiàn)了各種對怪物打擊的邏輯
- 3.CreateSwordFactory類,是具體實(shí)例化武器的類,通過客戶端的調(diào)用,可以傳入想要創(chuàng)建的武器。
- 4.Program就是客戶端
二.具體的代碼
1.Sword.cs類
namespace SimpleFactory
{
public class Sword
{
protected int monsterLife = 100;
public virtual void beat()
{
}
}
}2.WoodSword.cs
namespace SimpleFactory
{
????????public class WoodSword : Sword
????????{
????????????????public override void beat()
????????????????{
????????????????????????while (monsterLife > 0)
????????????????????????{
????????????????????????????????base.monsterLife -= 20;
????????????????????????????????Console.WriteLine("The Monster is already alive!");
????????????????????????}
????????????????????????Console.WriteLine("Excellent!The Monster is dead!");
????????????????}
????????}
}3.IronSword.cs
namespace SimpleFactory
{
public class IronSword:Sword
{
public override void beat()
{
while (monsterLife > 0)
{
base.monsterLife -= 50;
Console.WriteLine("The Monster is already alive!");
}
Console.WriteLine("Excellent!The Monster is dead!");
}
}
}4.DiamondSword.cs
namespace SimpleFactory
{
public class DiamondSword:Sword
{
public override void beat()
{
while (monsterLife > 0)
{
base.monsterLife -= 100;
Console.WriteLine("The Monster is already alive!");
}
Console.WriteLine("Excellent!The Monster is dead!");
}
}
}5.CreateSwordFactory.cs
namespace SimpleFactory
{
public class CreateSwordFactory
{
public static Sword CreateSword(string sword)
{
Sword s = null;
switch (sword)
{
case "WoodSword":
s = new WoodSword();
break;
case "IronSword":
s = new IronSword();
break;
case "DiamondSword":
s = new DiamondSword();
break;
default:
break;
}
return s;
}
}
}6.Program.cs
namespace SimpleFactory
{
class Program
{
static void Main(string[] args)
{
Sword s = CreateSwordFactory.CreateSword("WoodSword");
s.beat();
Console.WriteLine("----------------------");
s=CreateSwordFactory.CreateSword("IronSword");
s.beat();
Console.WriteLine("----------------------");
s = CreateSwordFactory.CreateSword("DiamondSword");
s.beat();
}
}
}三.運(yùn)行效果和總結(jié)
效果:

總結(jié):
簡單工廠模式的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):如下圖所示,這時(shí)候我們添加一個(gè)其他的劍,那么我不需要去修改我紅色區(qū)域的東西,僅僅修改CreateSwordFactory.cs這個(gè)類就行,然后這個(gè)類根據(jù)客戶端給出的具體產(chǎn)生什么劍再去實(shí)例化就可以了。不需要了解具體每一個(gè)劍是怎么被創(chuàng)建的。

缺點(diǎn):以為過多的依賴于工廠類,簡單工廠模式違背了“開放封閉原則”,就是違背了“系統(tǒng)對擴(kuò)展開放,對修改關(guān)閉”的原則,因?yàn)楫?dāng)我新增加一個(gè)劍的時(shí)候必須修改工廠類,相應(yīng)的工廠類就需要重新編譯一遍。
到此這篇關(guān)于C#簡單工廠模式的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)圖片上傳(PC端和APP)保存及 跨域上傳說明
這篇文章主要介紹了C#實(shí)現(xiàn)圖片上傳(PC端和APP)保存及 跨域上傳說明的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
Windows系統(tǒng)中使用C#讀取文本文件內(nèi)容的小示例
這篇文章主要介紹了Windows系統(tǒng)中使用C#讀取文本文件內(nèi)容的小示例,包括一次一行地讀取文本文件的方法,需要的朋友可以參考下2016-02-02
Microsoft Expression Web 簡體中文正式版 官方下載地址
Microsoft Expression Web 簡體中文正式版 官方下載地址...2007-07-07
C#使用AnimateWindow()實(shí)現(xiàn)動畫窗體的方法
用API函數(shù)AnimateWindow函數(shù)來實(shí)現(xiàn)窗體的動畫效果,在C#中,你可以使用P/Invoke技術(shù)調(diào)用Windows API中的AnimateWindow函數(shù)來實(shí)現(xiàn)動畫窗體,本文就給大家介紹了C#使用AnimateWindow()實(shí)現(xiàn)動畫窗體的方法,感興趣的朋友可以參考下2024-04-04
C#中FlagsAttribute屬性在enum中的應(yīng)用詳解
這篇文章主要介紹了C#中FlagsAttribute屬性在enum中的應(yīng)用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10

