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

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

结构图

示例

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

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

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

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

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

守了开闭原则

设计模式:工厂方法模式(Factory Method)的更多相关文章

  1. 大话设计模式--工厂方法模式 Factory Method -- C++实现

    1. 工厂方法模式 定义一个用于创建对象的接口, 让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 和简单工厂模式相比: A: 简单工厂模式最大的优点在于工厂类中包含有必要的逻辑判断, ...

  2. C#设计模式——工厂方法模式(Factory Method Pattern)

    一.概述在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?如何提供一种封装机制来隔离出“这个易变对象 ...

  3. [设计模式]工厂方法模式(Factory Method)

    模式目的 定义一个用于创建对象的接口,让其子类来决定实例化哪个类. 工厂方法模式将类的实例化延迟到了子类中进行. 模式结构 组成部分 产品(Product) - 定义了产品功能的接口 具体产品(Con ...

  4. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  5. 设计模式-03工厂方法模式(Factory Method Pattern)

    插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...

  6. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  7. 二十四种设计模式:工厂方法模式(Factory Method Pattern)

    工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...

  8. 工厂方法模式-Factory Method(Java实现)

    工厂方法模式-Factory Method 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法让实例化的具体内容交给子类工厂来进行. 本文中的例子是这样的. 生产一个身份证, ...

  9. IOS设计模式浅析之工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...

  10. 设计模式之工厂方法模式(Factory Method Pattern)

    一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...

随机推荐

  1. 最短路(Floyd_Warshall) POJ 2240 Arbitrage

    题目传送门 /* 最短路:Floyd模板题 只要把+改为*就ok了,热闹后判断d[i][i]是否大于1 文件输入的ONLINE_JUDGE少写了个_,WA了N遍:) */ #include <c ...

  2. ZOJ2314 Reactor Cooling(无源汇流量有上下界网络的可行流)

    题目大概说一个核反应堆的冷却系统有n个结点,有m条单向的管子连接它们,管子内流量有上下界的要求,问能否使液体在整个系统中循环流动. 本质上就是求一个无源汇流量有上下界的容量网络的可行流,因为无源汇的容 ...

  3. POJ 1064 (二分)

    题目链接: http://poj.org/problem?id=1064 题目大意:一堆棍子可以截取,问要求最后给出K根等长棍子,求每根棍子的最大长度.保留2位小数.如果小于0.01,则输出0.00 ...

  4. 【UVa】11270 Tiling Dominoes

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. Ubuntu(Linux) 下 unzip 命令使用详解

    1.功能作用:解压缩zip文件 2.位置:/usr/bin/unzip 3.格式用法:unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist ...

  6. 关于实现banner轮换的问题,如何修改

    最近遇到了这样的问题,本来banner都是gif格式的,但是现在要求上传图片格式为jpg时,运用JS实现动画效果,原来的也能用. aspx: <div id="bh" run ...

  7. 深度解析开发项目之 05 - 解决textField编辑之后点击其他内容改变的问题

    深度解析开发项目之 05 - 解决textField编辑之后点击其他内容改变的问题 问题的解决:  只需要给HeadeVIew加上这句代码

  8. FreeBSD Intel SYSRET Kernel Privilege Escalation Exploit

    /* * FreeBSD 9.0 Intel SYSRET Kernel Privilege Escalation exploit * Author by CurcolHekerLink * * Th ...

  9. MasterPage 变化了的 ClientID ctl00_

    在母版页的服务器端控件 其客户端ID 有时候是多变的 会对javascript jquery的内容获取 造成困扰 比如一个控件: <asp:ContentPlaceHolder ID=" ...

  10. DNS服务器的配置与应用: BIND9 的安装与配置

    3. BIND9 的安装与配置 3.1 bind简介 BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 协议的一个实现,提供了 ...