體驗工廠模式

摘要:體驗工廠模式

本文是以加減乘除來做一個範例,透過工廠模式來提供使用那一種運算方式來計算數字,達到數字與運算分離的功能,以便往後維護,擴充。

01 /// <summary>
02 /// 運算
03 /// </summary>

04 public class Operation
05 {
06     private double _numberA = 0;
07     private double _numberB = 0;
08
09     /// <summary>
10     /// 數字A
11     /// </summary>

12     public double NumberA
13     {
14         get { return _numberA; }
15         set { _numberA = value; }
16     }

17     /// <summary>
18     /// 數字B
19     /// </summary>

20     public double NumberB
21     {
22         get { return _numberB; }
23         set { _numberB = value; }
24     }

25     /// <summary>
26     /// 運算結果
27     /// </summary>
28     /// <returns></returns>

29     public virtual double GetResult()
30     {
31         double result = 0;
32         return result;
33     }

34 }

 

 

 

建立工廠的運算類別

/// <summary>
/// 加法運算
/// </summary>

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


}



/// <summary>
/// 減法運算
/// </summary>

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

}



/// <summary>
/// 乘法運算
/// </summary>

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

}



/// <summary>
/// 除法運算
/// </summary>

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

}

 

01 /// <summary>
02 /// 運算工廠
03 /// </summary>

04 public class OperationFactory
05 {
06     //建立工廠
07     public static Operation createOperate(string operate)
08     {
09         Operation oper = null;
10         switch (operate)
11         {
12             case "+":
13                 {
14                     oper = new OperationAdd(); break;
15                 }

16             case "-":
17                 {
18                     oper = new OperationSub(); break;
19                 }

20             case "*":
21                 {
22                     oper = new OperationMul(); break;
23                 }

24             case "/":
25                 {
26                     oper = new OperationDiv(); break;
27                 }

28         }

29         return oper;
30     }

31 }

 

範例實作:

 

<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:TextBox ID="txtNum1" runat="server"></asp:TextBox>
        <asp:DropDownList ID="ddrOper" runat="server">
            <asp:ListItem>+</asp:ListItem>
            <asp:ListItem>-</asp:ListItem>
            <asp:ListItem>*</asp:ListItem>
            <asp:ListItem>/</asp:ListItem>
        </asp:DropDownList>
        <asp:TextBox ID="txtNum2" runat="server"></asp:TextBox>
        <asp:Button ID="btSum" runat="server" onclick="btSum_Click" Text="計算" />
        <br />
        <asp:Label ID="lbTotal" runat="server"></asp:Label>
    
    </div>
    </form>
</body>


protected void btSum_Click(object sender, EventArgs e)
    {
        Operation oper = OperationFactory.createOperate(ddrOper.SelectedValue);
        oper.NumberA = double.Parse(txtNum1.Text);
        oper.NumberB = double.Parse(txtNum2.Text);
        lbTotal.Text = oper.GetResult().ToString();
    }