簡單工廠模式學習總結(C#)

    本人是一枚女程序“媛”,本科計算機出身,研究生轉的軟件,代碼量屈指可數。哈哈。。。最近在看一本設計模式的書,裏面的內容感覺講的挺不錯的,也就在這裏隨手寫一些筆記,大家可以共勉,有什麼不對的或者需要改進的地方歡迎各位批評指正。。。

    以前本科寫代碼只注重運行結果,只要能夠運行出來得到預期的效果就可以了。可是現在覺得能夠寫出來高質量的代碼更加重要。高質量的代碼可以從四個方面來衡量:①可維護性。②可複用性。③可擴展性。④靈活性好。

①可維護性:指當用戶需求改變時,只需更改少量代碼便可達到最終結果,且對其他模塊代碼影響低。

②可複用性:指相同的代碼塊可以運用在不同的程序中。比如:有一個運算類,裏面具體有實現加減乘除運算的方法。這個運算類可以在任何需要計算的時候被拿來使用,只需聲明該類並實例化對象再調用具體的方法即可。

③可擴展性:指需要增加一些功能需求時,只需更改少量代碼便可達到最終結果,且對其他模塊代碼影響低。

④靈活性好。

    面向對象的編程思想就是:通過封裝、繼承、多態把程序的耦合度降低,使用設計模式使得程序更加靈活、容易修改並且易於複用。

    下面分享一下“簡單工廠模式”的思想和一個小栗子。

    比如要實現一個計算器,假設目前只有加減乘除運算。首先,需要定義一個運算類(可以定義爲抽象類),加減乘除運算四個子類都繼承於運算類,子類中有自己運算需要的算法代碼。按照之前來說,如果需要實現兩個數的加法運算,就要實例化一個加法類的對象再進行運算;如果需要實現兩個數的減法運算,就要實例化一個減法類的對象再進行運算,乘法除法同理,我們有幾種運算就需要知道這些相關類的名稱都是什麼。如果你是用戶,會用這樣的計算器嗎?每次進行運算時需要先在大腦中回憶一下這個運算對應的類名是什麼。我想都不會願意的吧。所以需要有一個類來幫我們完成這項工作,這就是“工廠類”的工作。工廠就是用一個單獨的類來做創造實例的過程。如下代碼:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Factory_Model
{
    //運算類
   public class Operation {
        private double a;
        private double b;

        public double A { get => a; set => a = value; }
        public double B { get => b; set => b = value; }

        public virtual double Result() { 
            double result = 0;
            return result;
        }
    }
    //加法類
    class AddOperator : Operation {
        public override double Result() {
            double result = 0;
            result = A + B;
            return result;
        }
    }
    //減法類
    class SubOperator : Operation
    {
        public override double Result()
        {
            double result = 0;
            result = A - B;
            return result;
        }
    }
    //乘法類
    class MulOperator : Operation
    {
        public override double Result()
        {
            double result = 0;
            result = A * B;
            return result;
        }
    }
    //除法類
    class DivOperator : Operation
    {
        public override double Result()
        {
            double result = 0;
            if ( B == 0) {
                throw new Exception("除數不能爲0");
            }
            result = A / B;
            return result;
        }
            
    }
    //工廠類
    public class Factory_Operator
    {
        public static Operation CreateOperator(string operate)
        {
            Operation oper = null;
            switch (operate)
            {
                case "+":
                    oper = new AddOperator();
                    break;
                case "-":
                    oper = new SubOperator();
                    break;
                case "*":
                    oper = new MulOperator();
                    break;
                case "/":
                    oper = new DivOperator();
                    break;
                default:
                    Console.WriteLine("輸入運算符有誤!!!");
                    break;
            }
            return oper;
        }
    }
//測試類
    class Program
    {
        static void Main(string[] args)
        {
            //工廠模式
            Operation operation = null;
            operation = Factory_Operator.CreateOperator("+");
            operation.A = 4;
            operation.B = 8;
            double result = operation.Result();
            Console.WriteLine(result);
        }
    }
}

    上述代碼中只需要輸入相關的運算符,工廠類就會幫我們去實例化一個相應的對象,通過運算符的不同就能實例化不同類的對象。客戶再需給運算的數賦值,調用類中的運算方法就可以得到最終的運算結果。

    相比於之前我們的代碼對於客戶來說也更加友好了,再也不需要去記一些運算的類名。這些類名對於客戶來說都是不可知的,因此也就降低了客戶和後臺邏輯代碼的耦合性。(後臺和客戶端是C#WinForm中的俗語,自己不想畫框框和按鈕就把這些在控制檯實現一遍,這裏的測試類就相當於是客戶端啦。。。)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章