zoukankan      html  css  js  c++  java
  • 设计模式:工厂方法模式(Factory Method)

    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

             工厂方法使一个类的实例化延迟到其子类。

    结构图

    示例

    HTML代码:

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:TextBox runat="server" ID="txtNumberA"></asp:TextBox>
            <asp:DropDownList runat="server" ID="ddlType">
                <asp:ListItem Selected="True">+</asp:ListItem>
                <asp:ListItem>-</asp:ListItem>
                <asp:ListItem>*</asp:ListItem>
                <asp:ListItem>/</asp:ListItem>
            </asp:DropDownList>
            <asp:TextBox runat="server" ID="txtNumberB"></asp:TextBox>
            =
            <asp:TextBox runat="server" ID="txtResult"></asp:TextBox>
            <asp:Button runat="server" ID="btnCalculate" Text="计算" OnClick="btnCalculate_Click" />
            <asp:Label runat="server" ID="lblMsg"></asp:Label>
        </div>
        </form>
    </body>
    </html>
    View Code

    IFactory.cs:
     interface IFactory
        {
            Operation CreateOpertion();
        }

    AddFactory.cs:

     public class AddFactory : IFactory
        {
            public Operation CreateOpertion()
            {
                return new OperateAdd();
            }
        }

    SubFactory.cs:

     public class SubFactory : IFactory
        {
            public Operation CreateOpertion()
            {
                return new OperateSub();
            }
        }

    MulFactory.cs:

     public class MulFactory : IFactory
        {
            public Operation CreateOpertion()
            {
                return new OperateMul();
            }
        }

    DivFactory.cs:

     public class DivFactory : IFactory
        {
            public Operation CreateOpertion()
            {
                return new OperateDiv();
            }
        }

    Operation.cs:

     public class Operation
        {
            public int NumberA { get; set; }
    
            public int NumberB { get; set; }
    
            public virtual int GetResult()
            {
                return 0;
            }
        }
    View Code

    OperateAdd.cs:

     public class OperateAdd : Operation
        {
            public override int GetResult()
            {
                return NumberA + NumberB;
            }
        }
    View Code

    OperateSub.cs:

    public class OperateSub : Operation
        {
            public override int GetResult()
            {
                return NumberA - NumberB;
            }
        }
    View Code

    OperateMul.cs:

     public class OperateMul : Operation
        {
            public override int GetResult()
            {
                return NumberA * NumberB;
            }
        }
    View Code

    OperateDiv.cs:

     public class OperateDiv : Operation
        {
            public override int GetResult()
            {
                int result = 0;
    
                if (NumberB == 0)
                    throw new Exception("被除数为0!");
    
                result = NumberA / NumberB;
    
                return result;
            }
        }
    View Code

    客户端代码

      protected void btnCalculate_Click(object sender, EventArgs e)
            {
                IFactory factory = null;
    
                string type = ddlType.SelectedValue;
                switch (type)
                {
                    case "+":
                        factory = new AddFactory();
                        break;
                    case "-":
                        factory = new SubFactory();
                        break;
                    case "*":
                        factory = new MulFactory();
                        break;
                    case "/":
                        factory = new DivFactory();
                        break;
                }
    
                try
                {
                    Operation operation = factory.CreateOpertion();
                    operation.NumberA = Convert.ToInt32(txtNumberA.Text);
                    operation.NumberB = Convert.ToInt32(txtNumberB.Text);
    
                    txtResult.Text = operation.GetResult().ToString();
                }
                catch (Exception ex)
                {
    
                    lblMsg.Text = ex.Message;
                }
    
    
            }
    View Code

    简单工厂模式和工厂方法模式比较

    简单工厂:最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相应的类,对于客户端来说,

                  去除了与具体产品的依赖。(违反了开闭原则

    工厂方法:将必要的判断逻辑放在客户端,这样在增加新的产品类时只需要增加相应的工厂类,而不需要修改原来的类,遵

                   守了开闭原则

  • 相关阅读:
    js怎么通过逗号将string转换成数组
    设置mysql数据库为只读
    python 关于django 2.X from django.contrib.auth.views import login
    python Django2.X,报错 ‘learning_logs ’is not a registered namespace,如何解决?
    python django2.x报错No module named 'django.core.urlresolvers'
    python Django2.0如何配置urls文件
    VMware vSphere 组件和功能
    VMware vSphere Client的简单使用教程
    python 逻辑运算 ‘and’ ,'or' 在实战中的作用,代替if语句。
    python_urllib2:urlerror和httperror
  • 原文地址:https://www.cnblogs.com/qianxingdewoniu/p/3544046.html
Copyright © 2011-2022 走看看