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

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

结构图

示例

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>

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

OperateAdd.cs:

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

OperateSub.cs:

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

OperateMul.cs:

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

OperateDiv.cs:

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

客户端代码

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

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

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

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

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

守了开闭原则

最新文章

  1. 【原】iOS学习之UIApplication及其代理
  2. Javascript中函数及变量定义的提升
  3. 配置navigation bar外观
  4. WinForm - 格式化DataGridView单元格数据
  5. Android Studio 字体和字号调整
  6. leetcode-Evaluate the value of an arithmetic expression in Reverse Polish Notation
  7. vue中使用transition标签底部导航闪烁问题
  8. python-day97--git协同开发
  9. PHP 遍历文件夹下的文件以及子文件夹
  10. Bash/Shell-脚本整理(长期更新)
  11. java学习--高效的除模取余运算(n-1)&amp;hash
  12. Linux TTY驱动--Uart_driver底层【转】
  13. 【LeetCode】214. Shortest Palindrome
  14. 安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
  15. 在Xcode中显示代码行号
  16. swift--设置app图标和启动页面
  17. springboot利用MockMvc测试controller控制器
  18. openstack网络管理命令
  19. LintCode 394: First Will Win
  20. octopress github 换电脑 使用

热门文章

  1. 删除mysql
  2. BZOJ3808 : Neerc2012 Labyrinth of the Minotaur
  3. BZOJ3673 : 可持久化并查集
  4. 转:ie6与firefox操作iframe中DOM节点的一点不同
  5. Centos python 2.6 升级到2.7.3
  6. Shell 函数 function [转]
  7. &lt;META http-equiv=X-UA-Compatible content=IE=EmulateIE7&gt;
  8. 李洪强-C语言9-C语言的数据,变量和常量
  9. css阴影效果
  10. CVE-2013-3908 Internet Explorer打印预览功能可导致信息泄露