一、引言

  在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的。

二、工厂方法模式的实现

  工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。下面看下工厂模式的具体实现代码(这里还是以简单工厂模式中点菜的例子来实现):

namespace 设计模式之工厂方法模式
{/// <summary>/// 菜抽象类/// </summary>public abstract class Food{// 输出点了什么菜public abstract void Print();}/// <summary>/// 西红柿炒鸡蛋这道菜/// </summary>public class TomatoScrambledEggs : Food{public override void Print(){Console.WriteLine("西红柿炒蛋好了!");}}/// <summary>/// 土豆肉丝这道菜/// </summary>public class ShreddedPorkWithPotatoes : Food{public override void Print(){Console.WriteLine("土豆肉丝好了");}}/// <summary>/// 抽象工厂类/// </summary>public abstract class Creator{// 工厂方法public abstract Food CreateFoddFactory();}/// <summary>/// 西红柿炒蛋工厂类/// </summary>public class TomatoScrambledEggsFactory:Creator{/// <summary>/// 负责创建西红柿炒蛋这道菜/// </summary>/// <returns></returns>public override Food CreateFoddFactory(){return new TomatoScrambledEggs();}}/// <summary>/// 土豆肉丝工厂类/// </summary>public class ShreddedPorkWithPotatoesFactory:Creator{/// <summary>/// 负责创建土豆肉丝这道菜/// </summary>/// <returns></returns>public override Food CreateFoddFactory(){return new ShreddedPorkWithPotatoes();}}/// <summary>/// 客户端调用/// </summary>class Client{static void Main(string[] args){// 初始化做菜的两个工厂()Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory();Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();// 开始做西红柿炒蛋Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoddFactory();tomatoScrambleEggs.Print();//开始做土豆肉丝Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.CreateFoddFactory();shreddedPorkWithPotatoes.Print();Console.Read();}}
}

使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。例如,我们我们还想点一个“肉末茄子”,此时我们只需要定义一个肉末茄子具体工厂类肉末茄子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。具体代码为:

 /// <summary>/// 肉末茄子这道菜/// </summary>public class MincedMeatEggplant : Food{/// <summary>/// 重写抽象类中的方法/// </summary>public override void Print(){Console.WriteLine("肉末茄子好了");}}/// <summary>/// 肉末茄子工厂类,负责创建肉末茄子这道菜/// </summary>public class MincedMeatEggplantFactory : Creator{/// <summary>/// 负责创建肉末茄子这道菜/// </summary>/// <returns></returns>public override Food CreateFoddFactory(){return new MincedMeatEggplant();}}/// <summary>/// 客户端调用/// </summary>class Client{static void Main(string[] args){// 如果客户又想点肉末茄子了// 再另外初始化一个肉末茄子工厂Creator minceMeatEggplantFactor = new MincedMeatEggplantFactory();// 利用肉末茄子工厂来创建肉末茄子这道菜Food minceMeatEggplant = minceMeatEggplantFactor.CreateFoddFactory();minceMeatEggplant.Print();Console.Read();}}  

三、工厂方法模式的UML图

讲解完工厂模式的具体实现之后,让我们看下工厂模式中各类之间的UML图:

从UML图可以看出,在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的。针对UML图的解释如下:

Creator类:充当抽象工厂角色,任何具体工厂都必须继承该抽象类

TomatoScrambledEggsFactory和ShreddedPorkWithPotatoesFactory类:充当具体工厂角色,用来创建具体产品

Food类:充当抽象产品角色,具体产品的抽象类。任何具体产品都应该继承该类

TomatoScrambledEggs和ShreddedPorkWithPotatoes类:充当具体产品角色,实现抽象产品类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。

四、.NET中实现了工厂方法的类

.NET 类库中也有很多实现了工厂方法的类,例如Asp.net中,处理程序对象是具体用来处理请求,当我们请求一个*.aspx的文件时,此时会映射到System.Web.UI.PageHandlerFactory类上进行处理,而对*.ashx的请求将映射到System.Web.UI.SimpleHandlerFactory类中(这两个类都是继承于IHttpHandlerFactory接口的),关于这点说明我们可以在“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Web.Config”文件中找到相关定义,具体定义如下:

 <httpHandlers>
<add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" /><add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" /><add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />
</httpHandlers>

下面我们就具体看下工厂方法模式在Asp.net中是如何实现的,如果对一个Index.aspx页面发出请求时,将会调用PageHandlerFactory中GetHandler方法来创建一个Index.aspx对象,它们之间的类图关系如下:

五、总结

工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)。

转载于:https://www.cnblogs.com/zk-zhou/p/6526618.html

C#设计模式(3)——工厂方法模式相关推荐

  1. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  2. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  3. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  4. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  5. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

  6. 【设计模式】工厂方法模式(C#)

    [设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...

  7. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

  8. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  9. 021 设计模式之工厂方法模式,抽象工厂模式的区别

    简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...

最新文章

  1. Word 2010中利用尾注添加参考文献(论文必备)
  2. mysql 多列合并为一列_多列数据合并一列,还在用数据透视就out了,用=号只要三步完成...
  3. .Net Core下使用KeyDB高可用缓存集群
  4. Google App Engine Java功能和命名空间API
  5. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单...
  6. 6000毫安以上智能手机_展望2021年智能手机市场:这5大技术要爆发
  7. BZOJ3223文艺平衡树——非旋转treap
  8. iview中position: 'fixed'最顶层z-index
  9. 视差:disparity与UV-视差:UV-disparity
  10. redis之瘦小精干的位图 (一)
  11. python数据分析做什么作业好_知识星球 | 说说我为什么要做『python数据分析』社群...
  12. 叠加等边三角形的绘制 python_《叠》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  13. 58 同城 iOS 客户端组件化演变历程
  14. QT窗口:透明与半透明、不规则异形窗口、控件透明与半透明、不规则异形按钮
  15. 前端工程师的摸鱼日常(10)
  16. Zblog博客怎么实现QQ登陆?
  17. 惯性动作捕捉之工业设计
  18. 联想650服务器做系统,联想RD650阵列 安装系统步骤
  19. 北航数理统计大作业_如何自学概率论与数理统计/微积分/线性代数等科目
  20. XQuartz的使用

热门文章

  1. 拖动效果,防止选中文字兼容代码
  2. 牛客小白月赛2 D 虚虚实实 【欧拉图】【连通图】
  3. flask-wtforms
  4. 自动生成 指定范围日期 生成字符串格式时间日期 --计算连续时间 SQL
  5. [2017BUAA软工]结对项目:数独扩展
  6. 欢乐暑假-高校俱乐部暑期线上编程竞赛奖励机制
  7. ETL工具 kettle问题
  8. 蚂蚁金服CTO程立:AI尚不具备金融级的能力,开放是突破边界唯一出路
  9. 大数据热门职业薪酬榜 Hadoop人才居首
  10. SFB 项目经验-14-为某客户用Exchange 2016 UM作为总机的问题