C#設計模式三(簡單工廠模式)

C#設計模式之簡單工廠類

一、引言

如果將類比作是產品的話,那麼new一個對象就是生產出一個產品。
現在有若干個類需要我們進行選擇性的生產,那麼這時就會引出一個概念叫做工廠。

何爲工廠?
工廠就是能夠生產出各種產品的地方,生產需求根據客戶的要求生產。在程序中簡單的來說就是,可以指定一個工廠new出一個指定的類來。其他沒有選擇到的類不用new,以防資源泄露。整個new的過程全部在工廠內部完成,客戶無需干涉。

二、簡單工廠應用的場景

簡單工廠非常合適應用在同一個數據,不同的操作上。例如計算器。
如果想要對兩個數進行加/減/乘/除運算時。因爲兩個數都是一樣的,而方法可以選擇不同的。這類情況下,沒必要將加減乘除四個類全部創建實例,可以通過工廠來選擇新建需要的那個,然後進行相關計算。

三、簡單工廠模式實例

//操作基本規範,此爲父類以可看做是標準規範的接口

public 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;
    }
}

//加減乘除等具體計算類,他們全部繼承自Operation。符合一定規範

class OperationAdd : Operation  //加
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA + NumberB;
        return result;
    }
}

class OperationSub : Operation  //減
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA - NumberB;
        return result;
    }
}

class OperationMul : Operation  //乘
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA * NumberB;
        return result;
    }
}

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

class OperationSqr : Operation  //平方
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberB * NumberB;
        return result;
    }
}

class OperationSqrt : Operation  //平方根
{
    public override double GetResult()
    {
        double result = 0;
        if (NumberB < 0)
            throw new Exception("負數不能開平方根。");
        result = Math.Sqrt(NumberB);
        return result;
    }
}

class OperationReverse : Operation //相反數
{
    public override double GetResult()
    {
        double result = 0;
        result = -NumberB;
        return result;
    }
}

//運算工廠,主要是選擇性的新建某個指定的類

public 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;
                }
            case "sqr":
                {
                    oper = new OperationSqr();
                    break;
                }
            case "sqrt":
                {
                    oper = new OperationSqrt();
                    break;
                }
            case "+/-":
                {
                    oper = new OperationReverse();
                    break;
                }
        }

        return oper;
    }
}

//客戶端

//簡單工廠的核心在於通過工廠來選擇需要新建那一個類。從而根據選擇的類來進行相關操作
//而工廠中的類又都是符合一定標準規範,即他們都是派生自同一個父類,所以具有統一個接口

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 = "";

            Operation oper;
            oper = OperationFactory.createOperate(strOperate); //通過運算工廠來選擇需要新建那個類來作爲當前需要的類
            oper.NumberA = Convert.ToDouble(strNumberA);       //將選好的類的數值A賦值
            oper.NumberB = Convert.ToDouble(strNumberB);       //將選好的類的數值B賦值
            strResult = oper.GetResult().ToString();           //訪問選好類中的方法返回操作結果

            Console.WriteLine("結果是:" + strResult);

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

四、總結

簡單運算工廠就是選擇性的創建某個指定的類的對象,其他沒用到的對象不創建。

這樣做,實際上將一個類的新建放在了工廠內部完成,客戶端使用中不需要干涉具體的實現類。只需要和工廠打交道即可。

相關關係圖如下:
在這裏插入圖片描述

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