設計模式----簡單工廠

守望陽光01發表於2019-03-24

在設計模式這個體系中,我們聽的最多的應該就是工廠模式了。平時面試的時候一般面試官都會問你這個,即是是當初樓主初次面試的時候,那個時候樓主還是為了2K的實習工作而奔波著呢。。。

好了,廢話不多說了,接下來,讓我們進入今天的正題--簡單工廠

首先一步,我們設計一個場景吧!就平時我們的加減乘除怎麼樣,嗯!就這樣說了,那麼首先我們先建立一個運算類,我們想想,這個運算類要有什麼呢?

一個數學公式,無非就是三種數字吧,兩個數字用來作加減乘除運算,一個數字用來儲存結果,行為的話那自然就是進行加減乘除的邏輯運算啦!!!

public class Operation
    {
        private double _numberA;
        private double _numberB;
        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }

        public virtual double GetSum()
        {
            double retu = 0;
            return retu;
        }
    }

我們建立了一個Operation類,只有兩個屬性和一個虛方法,這裡解釋下虛方法,為什麼要定義虛方法,這是為了讓子類繼承的時候可以去實現它,也就是常說的函式的重寫,怎麼樣,Get到沒有。

接下來,我們就要建立子類了,為了滿足單一職責當然是加減乘除建立四個類,首先是加法類

public class OperationAdd : Operation
    {
        /// <summary>
        /// 加法
        /// </summary>
        /// <returns></returns>
        public override double GetSum()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

然後是減法類

class OperationSub : Operation
    {
        /// <summary>
        /// 減法
        /// </summary>
        /// <returns></returns>
        public override double GetSum()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

接下類乘法類

class OperationMul:Operation
    {
        /// <summary>
        /// 乘法
        /// </summary>
        /// <returns></returns>
        public override double GetSum()
        {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }

最後,是我們的除法類

class OperationDiv : Operation
    {
        /// <summary>
        /// 除法
        /// </summary>
        /// <returns></returns>
        public override double GetSum()
        {
            double result = 0;
            result = NumberA / NumberB;
            return result;
        }
    }

我們可以看到,這四個類中無一例外都繼承了Operation運算基類,然後都實現了重寫了方法GetSum(),這裡插個小知識點,子類重寫父類的方法其實就是在擴充套件父類,這也是我們希望的結果,我們是希望我們自己的程式是可擴充套件的,怎麼就擴充套件了呢

假如你有一個需求是在方法執行前或者方法執行後加上一些邏輯,你只需要加邏輯,原來老方法的內容可以不管,我們以除法為例子來說,先看程式碼

class OperationDiv : Operation
    {
        /// <summary>
        /// 除法
        /// </summary>
        /// <returns></returns>
        public override double GetSum()
        {
            base.GetSum();
            double result = 0;
            result = NumberA / NumberB;
            return result;
        }
    }

這裡我加上一條語句base.GetSum();,這條語句就是呼叫父類中的GetSum方法,這是在父類方法執行後加邏輯,這裡我們的父類是沒有什麼邏輯的,如果想在父類方法執行前加邏輯,我們可以把base.GetSum();方法挪動下,是不是看起來更加的清爽,而且再維護舊系統的時候也能一目瞭然的知道哪些是自己維護的程式碼。這裡就囉嗦到這,重寫和base的用法

好了,言歸正傳,我們建立完所有的類之後,接下來就是怎麼去把它們組合起來了,簡單工廠的核心(工廠本來就是把一個個零件組裝起來的嘛  哈哈哈)上程式碼

public class OperationFactory
    {


        public static Operation GetOperation(string str)
        {
            Operation operation = null;
            switch (str)
            {
                case "+":
                    operation = new OperationAdd();
                    break;
                case "-":
                    operation = new OperationSub();
                    break;
                case "*":
                    operation = new OperationMul();
                    break;
                case "/":
                    operation = new OperationDiv();
                    break;
            }
            return operation;
        }
    }

這裡,我們建立一個運算工廠類,這個工廠類只有一個方法,這個方法中用到了switch  case ,我們簡單的講解下吧,首先,我們看case有四個運算子,其實就是判斷字串是否為這四個字元,如果是+,就例項化我們上面建立的對應的類,然後這個方法是返回一個Operation類,就是這樣,簡單工廠的工廠建立完成了,接下來讓我們來呼叫測試下,上程式碼

class Program
    {
        static void Main(string[] args)
        {
            Operation operation = null;
            Console.WriteLine("請輸入你要輸入的第一個數字按回車結束");
            double str = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("請輸入你要輸入的第二個數字按回車結束");
            double strB = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("最後請輸入你要進行運算的符號按回車結束");
            string strSum = Console.ReadLine();
            operation = OperationFactory.GetOperation(strSum);
            if (operation == null) return;
            operation.NumberA = str;
            operation.NumberB = strB;
            double sum = operation.GetSum();
            Console.WriteLine("結果是:{0}", sum);
            Console.ReadKey();
        }
    }

這裡很明顯了,獲取三個使用者輸入的內容,然後賦值判斷加運算,這裡就是簡單工廠的全部了,核心就是那個工廠類。

 

相關文章