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

畫(huà)出場(chǎng)景的類圖

解釋:
- 1.Sword是一個(gè)基類,通過(guò)其中有一個(gè)字段保存怪物的血量,還有一個(gè)虛方法是打擊怪物的方法
- 2.有三個(gè)具體的武器的類,分別對(duì)應(yīng)木劍、鐵劍、金剛劍,實(shí)現(xiàn)了各種對(duì)怪物打擊的邏輯
- 3.CreateSwordFactory類,是具體實(shí)例化武器的類,通過(guò)客戶端的調(diào)用,可以傳入想要?jiǎng)?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é):
簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):如下圖所示,這時(shí)候我們添加一個(gè)其他的劍,那么我不需要去修改我紅色區(qū)域的東西,僅僅修改CreateSwordFactory.cs這個(gè)類就行,然后這個(gè)類根據(jù)客戶端給出的具體產(chǎn)生什么劍再去實(shí)例化就可以了。不需要了解具體每一個(gè)劍是怎么被創(chuàng)建的。

缺點(diǎn):以為過(guò)多的依賴于工廠類,簡(jiǎn)單工廠模式違背了“開(kāi)放封閉原則”,就是違背了“系統(tǒng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉”的原則,因?yàn)楫?dāng)我新增加一個(gè)劍的時(shí)候必須修改工廠類,相應(yīng)的工廠類就需要重新編譯一遍。
到此這篇關(guān)于C#簡(jiǎn)單工廠模式的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity使用物理引擎實(shí)現(xiàn)多旋翼無(wú)人機(jī)的模擬飛行
這篇文章主要介紹了Unity使用物理引擎實(shí)現(xiàn)多旋翼無(wú)人機(jī)的模擬飛行,包括了詳細(xì)的原理介紹和代碼實(shí)現(xiàn),對(duì)物理引擎感興趣的同學(xué),可以參考下2021-04-04
如何在Mac系統(tǒng)使用Visual Studio Code運(yùn)行Python
這篇文章主要介紹了Mac使用Visual Studio Code運(yùn)行Python環(huán)境的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
C#簡(jiǎn)單訪問(wèn)SQLite數(shù)據(jù)庫(kù)的方法(安裝,連接,查詢等)
這篇文章主要介紹了C#簡(jiǎn)單訪問(wèn)SQLite數(shù)據(jù)庫(kù)的方法,涉及SQLite數(shù)據(jù)庫(kù)的下載、安裝及使用C#連接、查詢SQLIte數(shù)據(jù)庫(kù)的相關(guān)技巧,需要的朋友可以參考下2016-07-07
C#檢查指定對(duì)象是否存在于ArrayList集合中的方法
這篇文章主要介紹了C#檢查指定對(duì)象是否存在于ArrayList集合中的方法,涉及C#中Contains方法的使用技巧,需要的朋友可以參考下2015-04-04
C#實(shí)現(xiàn)數(shù)字轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)數(shù)字轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
C# 讀寫自定義的Config文件的實(shí)現(xiàn)方法
本文主要介紹了C# 讀寫自定義的Config文件的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

