1. 程式人生 > >工廠方法(創建型)

工廠方法(創建型)

文件夾 tel 開始 over readline 工廠類 RR img 擴展

工廠方法(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 class
Game { 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)、將創建對象的任務委托給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類創建產品子類,需要時再動態指定。

  

工廠方法(創建型)