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

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

结构图

示例

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()
        {
            ;
        }
    }

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()
        {
            ;

            )
                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. C#设计模式——工厂方法模式(Factory Method Pattern)

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

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

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

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

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

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

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

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

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

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

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

  7. 设计模式之 - 工厂方法模式 (Factory Method design pattern)

    1. 模式意图:  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...

  8. 工厂方法模式(Factory Method Pattern)

    工厂方法模式概述 工厂方法模式是为了弥补简单工厂模式的不足并且继承它的优点而延生出的一种设计模式,属于GoF中的一种.它能更好的符合开闭原则的要求. 定义:定义了一个用于创建对象的接口,但是让子类决定 ...

  9. 六个创建模式之工厂方法模式(Factory Method Pattern)

    问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...

  10. 工厂方法模式(Factory Method)

    1.本质:延迟到子类来选择实现 2.示意图: 3.主要功能: 让父类在不知道具体实现的情况下,完成自身功能的调用 类似于注入 4.备注: 1.工厂方法中,通常父类是一个抽象类,里面包含创建对象的抽象工 ...

随机推荐

  1. react-native学习笔记--史上最详细Windows版本搭建安装React Native环境配置

    参考:http://www.lcode.org/react-native/ React native中文网:http://reactnative.cn/docs/0.23/android-setup. ...

  2. BZOJ4262: Sum

    Description   Input 第一行一个数 t,表示询问组数. 第一行一个数 t,表示询问组数. 接下来 t 行,每行四个数 l_1, r_1, l_2, r_2.   Output 一共 ...

  3. tomcat重启脚本

    #!/bin/bashPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binexport JAVA_HOME=/opt/jd ...

  4. XP共享连接数限制

  5. [转载]Masonry介绍与使用实践(快速上手Autolayout)

    原博地址 http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/ 前言 1 MagicNumber -> aut ...

  6. js模块化开发

    主要有两个:一个是sea.js,另一个是require.js

  7. [XML] ResourceManager一个操作Resource的帮助类 (转载)

    点击下载 ResourceManager.zip /// <summary> /// 类说明:Assistant /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更 ...

  8. Sort it all out

    poj1094:http://poj.org/problem?id=1094 题解(一位大神的分析) 一.当输入的字母全部都在前n个大写字母范围内时: (1)最终的图 可以排序: 在输入结束前如果能得 ...

  9. Hibernate工作原理及为什么要用?(转http://www.cnblogs.com/javaNewegg/archive/2011/08/28/2156521.html)

    原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.xml中的<mapping resou ...

  10. 编译Android ROM环境搭建

    环境搭建 1 安装ubuntu 推荐12.04或13.10 2 安装jdk7和一些所需要的包安装jdk7$ sudo apt-get update$ sudo apt-get install open ...