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

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

结构图

示例

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. 分布式实时日志处理平台ELK

    这三样东西分别作用是:日志收集.索引与搜索.可视化展现 l  logstash 这张架构图可以看出logstash只是collect和index的地方,运行时传入一个.conf文件,配置分三部分:in ...

  2. CentOS6.4 配置Nload监控网卡流量

    1.安装依赖包 yum install -y gcc gcc-c++ ncurses-devel make wget 2.下载Nload wget http://www.roland-riegel.d ...

  3. java向图片上写字,两个图片合并的方法

    package writeimg; import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; import ...

  4. HTML中为何P标签内不可包含块元素?

    起因:在做项目时发现原本在DW中无误的代码到了MyEclipse6.0里面却提示N多错误,甚是诧异.于是究其原因,发现块级元素P内是不能嵌套DIV的. 深究:我们先来认识in-line内联元素和blo ...

  5. WPF DataGrid的分页实现

    原理:其实分页功能的实现大家都清楚,无非就是把一个记录集通过运算来刷选里面对应页码的记录. 接来下我们再次添加新的代码 <Grid> <DataGrid  Name="da ...

  6. Error 2147943712 during task creation

    In a Windows 2008 server, when you confirm the creation of a new task, you may obtain the following ...

  7. 用MSoffice里的绘图工具

    试过一些绘图表的工具,在xbeta推荐的替代visio一文中介绍的一些软件.之前用得最多的就是Dia,在linux下也有.现在才发现在微软的office下的绘图工具已经足够我使用了,不需要专业的图形符 ...

  8. git基础及分支

    关于版本控制 git是一种分布版本控制系统,每一主机都保存了完整副本.必杀技是分支. 在Windows可安装git客户端msysgit. git基础 第一次看progit觉得有点不懂,不懂版本控制,一 ...

  9. hlg 2130 状压dp

    基本的状压dp 需要注意的是两点之间直线最短 所以不需要进行floyd 由于把dp的memset放在了初始化0的后面de了好久的bug.. #include<stdio.h> #inclu ...

  10. 每天学点GDB 11

    为了跟踪glibc库中函数的执行,需要带有debug symbol的glibc, 如果是debian或者是基于debian的发行版本如ubuntu和linuxmint之类的,很简单执行如下指令安装即可 ...