工廠方法(創建型)
工廠方法(Factory Method)
1、定義一個用於創建對象的接口,讓子類決定實例化哪一個類。使一個類的實例化延遲到其子類。
Client:作為開始節點
Game:抽象產品基類,做為具體的產品抽象類,所有同類的產品都繼承它
Factory:抽象工廠基類,任何產品工廠必須繼承
xxxGame:具體產品類,繼承抽象產品基類,並實現,由工廠創建實例對象。
xxxxFactory:具體的工廠類,用於創建產品實例
namespace 工廠方法 { class Program { static void Main(string[] args) {
Console.WriteLine("打開LOL"); //創建工廠 例如:電腦上某加密文件夾下有很多遊戲,文件夾可視為一個抽象工廠,具體某遊戲的包視為一個生產的工廠 GameFactory lol = new LOLFactory(); //找到工廠裏的EXE Game l= lol.OpenGame(); //開打遊戲開始氪金 l.Play(); l.Khorium(); Console.WriteLine("==================分割線================="); Console.WriteLine("打開DNF"); GameFactory dnf = new DNFFactory(); Game g = dnf.OpenGame(); g.Play(); g.Khorium(); Console.ReadLine(); } } /// <summary> /// 抽象工廠類 /// </summary> public abstract classGame { public abstract void Play(); public abstract void Khorium(); } public class LOL : Game { public override void Khorium() { Console.WriteLine("皮膚不錯充錢買個來裝B"); } public override void Play() { Console.WriteLine("開一局嗨起來"); } } public class DNF : Game { public override void Khorium() { Console.WriteLine("充錢不一定變強,不充錢一定是垃圾"); } public override void Play() { Console.WriteLine("又是充滿希望的一天"); } } /// <summary> /// 抽象產品 /// </summary> public abstract class GameFactory { public abstract Game OpenGame(); } public class LOLFactory : GameFactory { public override Game OpenGame() { return new LOL(); } } public class DNFFactory : GameFactory { public override Game OpenGame() { return new DNF(); } } }
使用工廠方法實現的系統,如果系統需要添加新產品時,我們可以利用多態性來完成系統的擴展,對於抽象工廠類和具體工廠中的代碼都不需要做任何改動,例如:想玩吃雞,上面沒有,在不改動抽象工廠和抽象產品的情況下,只需要添加具體產品和具體生產工廠對象。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠方法 { class Program { static void Main(string[] args) { Console.WriteLine("打開LOL"); GameFactory lol = new LOLFactory(); Game l= lol.OpenGame(); //開打遊戲開始氪金 l.Play(); l.Khorium(); Console.WriteLine("==================分割線================="); Console.WriteLine("打開DNF"); GameFactory dnf = new DNFFactory(); Game g = dnf.OpenGame(); g.Play(); g.Khorium(); Console.WriteLine("==================分割線================="); GameFactory pubg = new PUBGFactory(); Console.WriteLine("開始吃雞"); Game game= pubg.OpenGame(); game.Khorium(); game.Play(); Console.ReadLine(); } } /// <summary> /// 抽象工廠類 /// </summary> public abstract class Game { public abstract void Play(); public abstract void Khorium(); } public class PUBG : Game { public override void Khorium() { Console.WriteLine("首付+月供"); } public override void Play() { Console.WriteLine("晚上吃雞"); } } public class LOL : Game { public override void Khorium() { Console.WriteLine("皮膚不錯充錢買個來裝B"); } public override void Play() { Console.WriteLine("開一局嗨起來"); } } public class DNF : Game { public override void Khorium() { Console.WriteLine("充錢不一定變強,不充錢一定是垃圾"); } public override void Play() { Console.WriteLine("又是充滿希望的一天"); } } /// <summary> /// 抽象產品 /// </summary> public abstract class GameFactory { public abstract Game OpenGame(); } public class LOLFactory : GameFactory { public override Game OpenGame() { return new LOL(); } } public class DNFFactory : GameFactory { public override Game OpenGame() { return new DNF(); } } public class PUBGFactory : GameFactory { public override Game OpenGame() { return new PUBG(); } } }
優點:
(1)、 在工廠方法中,用戶只需要知道所要產品的具體工廠,無須關系具體的創建過程,甚至不需要具體產品類的類名。
(2)、在系統增加新的產品時,我們只需要添加一個具體產品類和對應的實現工廠,無需對原工廠進行任何修改,很好地符合了“開閉原則”。
缺點:
(1)、每次增加一個產品時,都需要增加一個具體類和對象實現工廠,是的系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴。這並不是什麽好事。
使用場景:
(1)、一個類不知道它所需要的對象的類。在工廠方法模式中,我們不需要具體產品的類名,我們只需要知道創建它的具體工廠即可。
(2)、一個類通過其子類來指定創建那個對象。在工廠方法模式中,對於抽象工廠類只需要提供一個創建產品的接口,而由其子類來確定具體要創建的對象,在程序運行時,子類對象將覆蓋父類對象,從而使得系統更容易擴展。
(3)、將創建對象的任務委托給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類創建產品子類,需要時再動態指定。
工廠方法(創建型)