設計模式之三(工廠方法模式)


前言

工廠方法模式:定義一個用於創建對象的接口,讓子類決定實例化那一個類。工廠方法使一個類的實例化延遲到其子類。

簡單工廠模式(http://www.cnblogs.com/aehyok/archive/2013/05/10/3072008.html)的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。

工廠方法模式實現時,客戶端需要決定實例化那一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移動到了客戶端代碼來進行。你想要加功能,本來是改工廠類的(簡單工廠模式),而現在是修改客戶端。

工廠方法UML類圖

 

如果想加一個功能,比如M的N次方,只需要增加此功能的運算類和相應的工廠類就可以了。

代碼實現

 1.第一步寫好運算類:

    ///Operation運算類
    public class Operation
    {
        public double NumberA { get; set; }

        public double NumberB { get; set; }

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

2.那么接下來就需要實現加減乘除運算類

    /// <summary>
    /// 加法運算類
    /// </summary>
    public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = this.NumberA + this.NumberB;
            return result;
        }
    }

    ///減法運算類
    public class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = this.NumberA - this.NumberB;
            return result;
        }
    }

    /// <summary>
    /// 乘法運算類
    /// </summary>
    public class OperationMul : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = this.NumberA * this.NumberB;
            return result;
        }
    }

    /// <summary>
    /// 除法運算類
    /// </summary>
    public class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (this.NumberB == 0)
            {
                throw new Exception("除數不能為0。");
            }
            result = this.NumberA / this.NumberB;
            return result;
        }
    }

第三步寫好抽象工廠

    ///抽象工廠 工廠接口
    public interface IFactory
    {
        Operation CreateOperation();
    }

工廠接口返回的就是運算類

第四步實現加減乘除抽象工廠

    /// <summary>
    /// 加法工廠類
    /// </summary>
    public class AddFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }

    /// <summary>
    /// 減法工廠類
    /// </summary>
    public class SubFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }

    /// <summary>
    /// 乘法工廠類
    /// </summary>
    public class MulFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }

    /// <summary>
    /// 除法工廠類
    /// </summary>
    public class DivFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }

第五步進行調用一個加法的示例

    class Program
    {
        static void Main(string[] args)
        {
            ////調用加法的示例
            IFactory OperationFactory = new AddFactory();
            Operation Oper = OperationFactory.CreateOperation();
            Console.WriteLine("輸入第一個數字:A");
            Oper.NumberA = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("輸入第二個數字:B");
            Oper.NumberB = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine(Oper.GetResult());
            Console.ReadLine();
        }
    }

運行后結果為

總結

 工廠方法模式克服了簡單工廠違背開放-封閉原則的缺點,有保持了封裝對象創建過程的優點。工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。但缺點是由於每加一個產品,就需要加一個產品工廠的類,增加了額外的開發量。當然還有更好的方案……

如果您對上節的簡單工廠模式還不太了解可以看一下http://www.cnblogs.com/aehyok/archive/2013/05/10/3072008.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM