本篇內容介紹了“C#如何實現工廠方法模式”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
場景:簡單工廠時候,我設計了一個場景,有三種劍去打怪,這時候,需求變化了,我三種劍變成了,匕首、劍以及木棒,想要用工廠方法來實現,怎么弄?
1.上文講過簡單工廠模式,它的最大優點在于工廠類內有創建類型的判斷邏輯,客戶端只需要通過動態的選擇想要創建的類型,就可以交給工廠類來創建,去除了客戶與具體產品之間的依賴。
缺點在于,當新建一個類型的時候,需要修正工廠類中的判斷邏輯,添加一個case,此時就違背了開放-封閉原則。
2.工廠方法模式的引入:定義一個用于創建對象的接口,讓子類覺得實例化哪一個類,工廠方法模式使得一個類的實例化延遲到了它的子類。
客戶端再使用工廠方法模式的時候,需要決定實例化哪一種工廠,選擇判斷的問題依然存在,也就是說工廠方法模式是對簡單工廠的改進,把判斷邏輯移動到了客戶端。當加入新功能時候,原來是要修正工廠類,現在修改客戶端就行了。
領悟:例如在進行編寫一個計算器的時候。
①如果把所有的判斷邏輯和類的創建放在一個類中,那么出現的問題是,新增加一個功能,其他的功能也會收到影響。所以引進了簡單工廠模式,使得耦合性降低了。
②簡單工廠在添加新功能的時候,需要改工廠類,同樣違背開放-封閉原則,對更改是關閉的,對擴展是開放的。
③針對簡單工廠又出現了工廠方法,這時候將工廠類進一步抽象為多個工廠類。這時候我添加一個新功能,就需要添加一個新的工廠類和一個具體的功能類。工作量也變大了。
Product:抽象產品
ConcreteProduct:具體產品
Factory:抽象工廠
ConcreteFactory:具體工廠
3.代碼實現:
Weapon.cs
namespace FactoryMethod { public class Weapon { //設計一個怪獸,血量是100(其實并不是很合適,怪獸應該單獨設計 //作為beat方法的參數傳入 protected int monsterLife = 100; public virtual void beat() { } } }
Knife.cs
namespace FactoryMethod { public class Knife : Weapon { public override void beat() { while (monsterLife > 0) { base.monsterLife -= 20; Console.WriteLine("The Monster is still alive!"); } Console.WriteLine("Excellent!The Monster is dead!"); } } }
Sword.cs
namespace FactoryMethod { public class Sword:Weapon { public override void beat() { while (monsterLife > 0) { base.monsterLife -= 50; Console.WriteLine("The Monster is still alive!"); } Console.WriteLine("Excellent!The Monster is dead!"); } } }
Stick.cs
namespace FactoryMethod { public class Stick:Weapon { public override void beat() { while (monsterLife > 0) { base.monsterLife -= 100; Console.WriteLine("The Monster is still alive!"); } Console.WriteLine("Excellent!The Monster is dead!"); } } }
IWeaponFactory.cs
namespace FactoryMethod { public interface IWeaponFactory { Weapon CreateWeapon(); } }
KnifeFactory.cs
namespace FactoryMethod { public class KnifeFactory:IWeaponFactory { public Weapon CreateWeapon() { return new Knife(); } } }
SwordFactory.cs
namespace FactoryMethod { public class SwordFactory : IWeaponFactory { public Weapon CreateWeapon() { return new Sword(); } } }
StickFactory.cs
namespace FactoryMethod { public class StickFactory:IWeaponFactory { public Weapon CreateWeapon() { return new Stick(); } } }
Program.cs
namespace FactoryMethod { class Program { static void Main(string[] args) { IWeaponFactory factory = new SwordFactory(); Weapon weapon = factory.CreateWeapon(); weapon.beat(); factory = new KnifeFactory(); weapon = factory.CreateWeapon(); weapon.beat(); factory = new StickFactory(); weapon = factory.CreateWeapon(); weapon.beat(); Console.ReadKey(); } } }
運行結果:
“C#如何實現工廠方法模式”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。