簡單工廠模式小結整理

一.代碼無錯就是好?

class Program
    {
        static void Main(string[] args)
        {
            Console.Write("請輸入數字A:");
            string A = Console.ReadLine();
            Console.Write("請選擇運算符號(+、-、*、/):");
            string B = Console.ReadLine();
            Console.Write("請輸入數字B:");
            string C = Console.ReadLine();
            string D = "";

            if (B == "+")
                D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C));
            if (B == "-")
                D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C));
            if (B == "*")
                D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C));
            if (B == "/")
                D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C));
            Console.WriteLine("結果是:" + D);
        }
}

存在問題:

(1)變量命名,ABCD,變量不帶有任何具體含義,非常不規範的;

(2)判斷分支,每個條件都要做判斷,等於計算機做了三次無用功;

(3)數據輸入有效性判斷等,如果用戶輸入的是字符符號而不是數字怎麼辦?如果除數時,客戶輸入了0怎麼辦?


二.代碼規範、重構

class Program
    {
        static void Main(string[] args) {
            try{
                Console.Write("請輸入數字A:");
                string strNumberA = Console.ReadLine();

                Console.Write("請選擇運算符號(+、-、*、/):");
                string strOperate = Console.ReadLine();

                Console.Write("請輸入數字B:");
                string strNumberB = Console.ReadLine();

                string strResult = "";

                switch (strOperate)
                {
                    case "+":
                        strResult = Convert.ToString
                        (Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB));
                        break;

                    case "-":
                        strResult = Convert.ToString
                        (Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB));
                        break;

                    case "*":
                        strResult = Convert.ToString
                        (Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB));
                        break;

                    case "/":
                        if (strNumberB != "0")
                            strResult = Convert.ToString
                         (Convert.ToDouble(strNumberA)/Convert.ToDouble(strNumberB));
                        else
                            strResult = "除數不能爲0";
                        break;
                }
                Console.WriteLine("結果是:" + strResult);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("您的輸入有錯:" + ex.Message);
            }
        }
}

要用面向對象的編程方法去實現

比如這個程序,先要求輸入兩個數和運算符號,然後根據運算符號判斷選擇如何運算,得到結果,

這樣的思維卻使得我們的程序只爲滿足實現當前的需求,程序不容易維護,不容易擴展,更不容易複用。從而達不到高質量代碼的要求。


如果要求再寫一個windows的計算器,現在的代碼就能複用嗎?

代碼複製過去不就行了嗎?---->改動又不大,不算麻煩。

這其實是非常不好的編碼習慣,因爲當你的代碼中重複的代碼多到一定程度,維護的時候,可能就是一場災難。

越大的系統,這種方式帶來的問題越嚴重,編程有一原則,就是用盡可能的辦法去避免重複。

這段代碼,將控制檯有關的和計算器有關的分開會則麼樣。


三.業務的封裝


客戶端代碼

 class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.Write("請輸入數字A:");
                string strNumberA = Console.ReadLine();

                Console.Write("請選擇運算符號(+、-、*、/):");
                string strOperate = Console.ReadLine();

                Console.Write("請輸入數字B:");
                string strNumberB = Console.ReadLine();

                string strResult = "";
                strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate));

                Console.WriteLine("結果是:" + strResult);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("您的輸入有錯:" + ex.Message);
            }
        }
    }


Operation類

class Operation
    {
        public static double GetResult(double numberA, double numbleB, string operate)
        {
            double result = 0;
            switch (operate)
            {
                case "+":
                    result = numberA + numbleB;
                    break;
                case "-":
                    result = numberA - numbleB;
                    break;
                case "*":
                    result = numberA * numbleB;
                    break;
                case "/":
                    result = numberA / numbleB;
                    break;
            }
            return result;
        }
    }

修改後:不單是Windows程序,Web版程序需要運算可以用它,PDA,手機等需要移動系統的軟件需要運算也可以用它

但是隻用了封裝,繼承和多態未體現。


四.簡單工廠模式

客戶端代碼

static void Main(string[] args)
        {
            try
            {
                Console.Write("請輸入數字A:");
                string strNumberA = Console.ReadLine();

                Console.Write("請選擇運算符號(+、-、*、/):");
                string strOperate = Console.ReadLine();

                Console.Write("請輸入數字B:");
                string strNumberB = Console.ReadLine();

                Operation oper;
                oper = OperationFactory.createOperate(strOperate);

                oper.NumberA = Convert.ToDouble(strNumberA);
                oper.NumberB = Convert.ToDouble(strNumberB);

                double result = oper.GetResult();

                Console.WriteLine("結果是:" + result);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("您的輸入有錯:" + ex.Message);
            }
        }

簡單運算工廠類

class OperationFactory
    {
        public static Operation createOperate(string operate)
        {
            Operation oper = null;
            switch (operate)
            {
                case"+":
                    oper = new OperationAdd();
                    break;
                case"-":
                    oper = new OperationSub();
                    break;
                case"*":
                    oper = new OperationMul();
                    break;
                case "/":
                    oper = new OperationDiv();
                    break;
            }
            return oper;
        }
    }

Operation 運算類

class Operation
    {
        private double _numberA = 0;
        private double _numberB = 0;

        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }


加減乘除類

class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB == 0)
                throw new Exception("除數不能爲0.");
            result = NumberA / NumberB;
            return result;
        }
    }

優點:

1.若要修改加法  只需要改 OperationAdd

2.若要增加各種複雜的運算 只要增加相應的運算子類+運算工廠中的 Switch分支

3.若要改界面 則不需要修改運算


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