設計模式 - 工廠模式

  • 1236
  • 0

此篇簡單介紹工廠模式。

關注在 : 

  • 針對要實例出什麼物件做思考
  • 針對Return的產物
  • 針對外部輸入的引數做限制

要點 :

  • 使用外部輸入的引數對後續的方法來做規範
  • 使用列舉來規範參數

 

類別圖 : 

 

賣茶的 - 抽象類 : 

using System;

namespace SimpleFactoryPattern.TeaStore
{
    /// <summary>
    /// 此介面為各個飲料的共同動作
    /// </summary>
    interface InterfaceAllTea
    {
        /// <summary>
        /// 加料
        /// </summary>
        void addMaterial();

        /// <summary>
        /// 沖泡
        /// </summary>
        void brew();

        /// <summary>
        /// 裝杯
        /// </summary>
        void pouredCup();
    }
}

 

 

賣茶的 - 實作類 : 

using System;

namespace SimpleFactoryPattern.TeaStore
{
    // 賣綠茶的
    internal class GreenTea : InterfaceAllTea
    {
        /// <summary>
        /// 加料
        /// </summary>
        void InterfaceAllTea.addMaterial()
        {
            Console.WriteLine("綠茶加料");
        }

        /// <summary>
        /// 沖泡
        /// </summary>
        void InterfaceAllTea.brew()
        {
            Console.WriteLine("綠茶沖泡");
        }

        /// <summary>
        /// 裝杯
        /// </summary>
        void InterfaceAllTea.pouredCup()
        {
            Console.WriteLine("綠茶裝杯");
        }
    }

    // 賣紅茶的
    internal class BlackTea : InterfaceAllTea
    {
        /// <summary>
        /// 加料
        /// </summary>
        void InterfaceAllTea.addMaterial()
        {
            Console.WriteLine("紅茶加料");
        }

        /// <summary>
        /// 沖泡
        /// </summary>
        void InterfaceAllTea.brew()
        {
            Console.WriteLine("紅茶沖泡");
        }

        /// <summary>
        /// 裝杯
        /// </summary>
        void InterfaceAllTea.pouredCup()
        {
            Console.WriteLine("紅茶裝杯");
        }
    }
}

 

 

茶工廠類 : 

using System;

namespace SimpleFactoryPattern.SimpleFactory
{

    /// <summary>
    /// 此工廠是對應到所有需實例的類別(使用列舉來對應)
    /// </summary>
    internal class SimpleFactoryClass
    {
        /// <summary>
        /// 外部介面的選擇,好讓工廠可以依初始值來判別是否是DI介面選擇錯誤
        /// </summary>
        public enum ChioceInterface : int
        {
            Default = -1,
            InterfaceAllTea = 0            
        };

        /// <summary>
        /// 關於茶功能 要實例哪種子類別?
        /// </summary>
        public enum TeaChioceChildClass : int
        {
            GreenTea = 0,
            BlackTea = 1
        };

        /// <summary>
        /// 程式內部應用為了判別IoC介面當前選擇了何種介面
        /// </summary>
        private ChioceInterface _chioceInterface = ChioceInterface.Default;

        /// <summary>
        /// 工廠初始化請選擇對應的介面,已讓工廠完成後續的動作
        /// </summary>
        /// <param name="paraInterfaceChioce"> 輸入欲使用的抽象類別 </param>
        public SimpleFactoryClass(ChioceInterface paraInterfaceChioce)
        {
            switch (paraInterfaceChioce)
            {
                case ChioceInterface.InterfaceAllTea:
                    this._chioceInterface = paraInterfaceChioce; //初始化自用欄位
                    break;
                default:
                    throw new NotImplementedException();
            }
        }

        /// <summary>
        /// 此為製作飲料的方法,Return 回 TeaStore.InterfaceAllTea 的實作類別
        /// </summary>
        /// <param name="paraTeaChioceChild"> 選擇子類別 </param>
        /// <returns></returns>
        public TeaStore.InterfaceAllTea createAllTeaOb(TeaChioceChildClass paraTeaChioceChild)
        {
            // 請先確定 欲建立的實作的抽象類別
            if (this._chioceInterface != ChioceInterface.InterfaceAllTea) throw new NotImplementedException();
            switch (paraTeaChioceChild)
            {
                case TeaChioceChildClass.GreenTea:
                    return new TeaStore.GreenTea(); // return 賣綠茶的
                case TeaChioceChildClass.BlackTea:
                    return new TeaStore.BlackTea(); // return 賣紅茶的
                default:
                    throw new NotImplementedException();
            }
        }
    }
}

 

 

用戶端 : 

using System;

namespace SimpleFactoryPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            // 初始化工廠 選擇欲實作的抽象類別
            SimpleFactory.SimpleFactoryClass factroy1 =
                new SimpleFactory.SimpleFactoryClass(SimpleFactory.SimpleFactoryClass.ChioceInterface.InterfaceAllTea);
            // 使用工廠方法回傳實例
            var tea = factroy1.createAllTeaOb(SimpleFactory.SimpleFactoryClass.TeaChioceChildClass.GreenTea);
            tea.addMaterial();
            tea.brew();
            tea.pouredCup();
            Console.WriteLine();
            tea = null;
            // 切換實作
            tea = factroy1.createAllTeaOb(SimpleFactory.SimpleFactoryClass.TeaChioceChildClass.BlackTea);
            tea.addMaterial();
            tea.brew();
            tea.pouredCup();
            tea = null;
            Console.Read();
        }
    }
}

 

結果顯示 : 

 


多多指教!! 歡迎交流!!

你不知道自己不知道,那你會以為你知道