設計模式系列(2) 工廠模式之簡單工廠模式

 

  工廠模式專門負責將大量有共同接口的類實例化。工廠模式能夠動態決定將哪個類實例化,沒必要事先知道每次要實例化哪個類。
工廠模式有如下三種形態:web

  • 簡單工廠(Simple Factory)模式
  • 工廠方法(Factory Method)模式
  • 抽象工廠(Abstract Factory)模式

  這一篇文章要總結的是比較經常使用的簡單工廠模式。算法

一,定義:

  Simple Factory模式根據提供給它的數據,返回幾個可能類中的一個類的實例。一般它返回的類都有一個公共的父類和公共的方法。ide

二,角色介紹和結構圖:

  

  簡單工廠模式一般有三個角色。
  1,工廠類(指的是簡單工廠類),工廠類在客戶端的直接控制下建立產品(指的是具體的算法類如加法)對象。
  2,抽象產品類(指的是運算類),定義簡單工廠建立的對象的父類或它們共同擁有的接口。能夠是一個類,抽象類或接口。
  3,具體產品類(如加法類),定義工廠加工出的具體對象。post

三,程序實現:

複製代碼
//抽象類
    public abstract class Operation
    {
        private double _numberA = 0d;
        private double _numberB = 0d;

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

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

//具體類(由簡單工廠類來實例化)
    public class OperationAdd:Operation
    {
        public override double GetResult()//override父類虛方法
        {
            double result = 0d;
            result = NumberA + NumberB;
            return result;
        }
    }

//具體類(由簡單工廠類來實例化)
    public class OperationSub:Operation
    {
        public override double GetResult()
        {
            double result = 0d;
            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;
        }
    }

//簡單工廠類
    public class OperationFactory
    {
        public static Operation CreateOperate(string operate)
        {
            Operation operation = null;
            switch (operate)
            { 
                case "+":
                    operation = new OperationAdd();//應用了里氏替換原則
                    break;
                case "-":
                    operation = new OperationSub();
                    break;
                case "*":
                    operation = new OperationMul();
                    break;
                case "/":
                    operation = new OperationDiv();
                    break;
            }
            return operation;
        }
    }

//客戶端調用
    class Program
    {
        static void Main(string[] args)
        {
            Operation operation = null;
            Console.WriteLine("請輸入運算符:");
            operation = OperationFactory.CreateOperate(Console.ReadLine());//根據輸入的字符,工廠類來決定實例化具體的產品對象
            Console.WriteLine("請輸入第一個數字:");
            operation.NumberA = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("請輸入第二個數字:");
            operation.NumberB = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("結果爲:"+operation.GetResult());
            Console.ReadKey();
        }
    }
複製代碼

四,總結:

  優勢:工廠類決定了實例化哪個具體"產品"類,客戶端免去了建立產品對象的責任,而僅僅是"消費"產品,從而實現了對責任的分割,也就是程序的耦合度更低了。
  缺點:工廠類集中了全部產品的建立邏輯,一旦工廠類不能工做,整個系統都會受到影響。任何事物都有兩面性,相較於它給咱們帶來的好處,整體來講仍是利大於弊的。this

相關文章
相關標籤/搜索