K書記錄-大話設計模式-工廠方法

工廠方法的範例以及和簡單工廠的比較

任務 : 做一個加減乘除計算機

UML :

1.先建立一個基本的計算類別

程式碼 :

    public class Operation
    {
        private double numberA;
        public double NumberA
        {
            get { return numberA; }
            set { numberA = value; }
        }
        private double numberB;
        public double NumberB
        {
            get { return numberB; }
            set { numberB = value; }
        }
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

 

說明 : 將基本的計算內容實現,由於是兩個數值的計算,所以先建立number1和number2的數值待運算,之後建立GetResult()的方法把計算結果列出來。

 

2.在建立加、減、乘、除法類別,繼承計算類別

程式碼 :


    public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }
    public class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }
    public class OperationMul : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }
    public class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB == 0)
            {
                throw new Exception("除數不得為0");
            }
            result = NumberA / NumberB;
            return result;
        }
    }

說明 :

先繼承了父類別,所以自身就擁有了Number1,Number2和GetResult(),不過計算法不同,直接使用override複寫掉父類別的GetResult()方法,改成加減乘除的計算。

--------------------------------------------------------------------到這裡跟簡單工廠都一樣--------------------------------------------------------------------

3.建立一個計算的介面

程式碼 :

   public interface IOperationFactory
    {
        Operation CreateOperation();
    }

說明 :

建立一個介面,該介面有一個回傳Operation的CreateOperation()的方法。

 

4.建立每個計算類別的工廠,每個工廠都繼承了介面IOperationFactory

程式碼 :

public class AddFactory : IOperationFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }

    public class SubFactory : IOperationFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }
    public class MulFactory : IOperationFactory
    {
        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }
    public class DivFactory : IOperationFactory
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }

說明 :

每個繼承了IOperationFactory的計算工廠都必須實作該介面的方法CreateOperation(),所以每個工廠都能產出計算類別。

 

5.使用工廠方法

程式碼 :

        static void Main(string[] args)
        {
            IOperationFactory operationFactory = new PowFactory();
            Operation operation = operationFactory.CreateOperation();
            operation.NumberA = 5;
            operation.NumberB = 3;
            double result = operation.GetResult();
            Console.WriteLine(result);
            Console.ReadLine();

        }

說明 :

a.先建立一個計算工廠,需要怎樣的計算工廠由使用者決定

b.建立一個計算方法,此方法是由剛剛建立的計算工廠產出的類別

c.設定要計算的數值1、數值2。

d.取得計算後的答案

e.寫出答案

 

小結 :

跟上一篇的簡單工廠其實大同小異,不過先來比較一下調用者如何使用該計算機

        //簡單工廠
        static void Main(string[] args)
        {
            Operation operation = OperationFactory.CreateOperate("+");
            operation.NumberA = 5;
            operation.NumberB = 3;
            double result = operation.GetResult();
            Console.WriteLine(result);
            Console.ReadLine();
        }

        //工廠方法
        static void Main(string[] args)
        {
            IOperationFactory operationFactory = new PowFactory();
            Operation operation = operationFactory.CreateOperation();
            operation.NumberA = 5;
            operation.NumberB = 3;
            double result = operation.GetResult();
            Console.WriteLine(result);
            Console.ReadLine();

        }

簡單工廠利用傳入的參數來決定工廠產生什麼計算類別

Operation operation = OperationFactory.CreateOperate("+");

工廠方法則是先決定要使用什麼計算工廠產生計算類別

IOperationFactory operationFactory = new PowFactory();
Operation operation = operationFactory.CreateOperation();

看起來沒有差很多,都能使用,但是今天要加一個方法叫做a的b次方的話,兩個模式分別要怎麼加入呢?

首先,兩者都要先加上a的b次方類別

    public class OperationPow : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = Math.Pow(NumberA, NumberB);
            return result;
        }
    }

簡單工廠擴展了"^"的分支,修改了原本的CreateOperate方法

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

工廠方法擴展了一個工廠

    public class PowFactory : IOperationFactory
    {
        public Operation CreateOperation()
        {
            return new OperationPow();
        }
    }

當有新需求出現需要有一個開根號的方法時呢?

簡單工廠的Switch Case會不斷長大、不斷分支(對擴展開放,對修改也開放)

工廠方法只需要建立新的工廠就能解決(對擴展開放,對修改封閉)

 

 

 

新手上路,若有錯誤請不吝嗇指教,謝謝。