工厂方法模式8902213373.pdfVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
工厂方法模式8902213373

eldersubhuti 主题: 设计模式——工厂方法模式 条目类型: 文档 开始时间: 2012-1-18 (星期三) 23:01 结束时间: 2012-1-18 (星期三) 23:01 持续时间: 0 小时 /eldersubhuti/article/details/7209955    最近在看《软件设计精要与模式(第 2 版)》,先从第 6 章《.NET 中的工厂方法模式》说起。    在这一章中,作者先举了一个例子,就是 Car 和 Engine 的关系,并以此说明了为何要引入工厂方法模式,对于这个 例子,只是引出问题,然后就草草收场了。接着对.NET 中WebRequest 对象的创建过程中的工厂模式进行了详细的 剖析,最后说明了“惯例优于模式”。    现在说说具体的问题引入,比如我有一个 Engine 的类,派生出SolarEngine 和 GaslineEngine 分别表示太阳能发动机 和汽油发动机,这些发动机应用到 Car 这个类上面。Car 这个类不用太关注,关键在与 Engine 类上面。    假设我有几个模块,其中用到了 Engine 下面的具体的类。比如 A 模块中有一个创建对象的语句  Engine engine=new SolarEngine();  B 模块中也有  Engine engine=new SolarEngine();  或者 C、D、E…很多模块都是这么写的。    现在突然有要求,把上面的所有 SolarEngine 类用 GaslineEngine 类来代替,这样的话,就不得不把所有的模块中的 上面这句话替换为  Engine engine = new GaslineEngine();  也就是说,一个需求变了,结果所有的模块的代码都要改写。    因此,现在希望的结果就是这些模块都不改动,它们会根据其他模块(比如只需更改一个模块)就会自动地创建出 GaslineEngine 对象出来;更进一步地,当我有新的 Engine 出现,比如核发动机(NuclearEngine)吧,这些模块不用 任何更改就能自动创建 NuclearEngine 对象。    然后作者说明了用工厂模式可以解决这个问题,但只是一笔带过,直接转到对.NET 设计中的工厂模式的剖析去了。   实际上,这里提出的问题,跟后面.NET 中WebRequest 的例子还是不同的,为什么这么说?  在这些 A,B,C….模块里,我们最希望看到的就一句话  Engine engine=Engine.Create(); //Create 是 Engine 的静态方法  就能创建需要实际需要的对象(不管你是 GaslineEngine,还是 SolarEngine,还是以后的 NuclearEngine)。也就是说 在 A,B,C…这些模块里根本看不到诸如 gasline,solar 这样的字眼。     而后面.NET 的例子跟这个 Engine 的例子还是有点不一样的,它不是说在什么模块里面,而是当我需要创建的时候, 希望用 WebRequest.Create(“http://”) 就创建 HttpWebRequest 对象;用 WebRequest.Create(“file://”) 就创建 FileWebRequest 对象。如果要套到上面的例子里面,那应该是 Engine.Create(“solar”),Engine.Create(“gasline”)…;也就 是说,在这些模块里面还是出现了 solar 这样的信息性字眼。那如果要改成其它的,岂不是所有模块都要改成 Engine.Create(“gasline”)?还是不完美吧。    下面通过逐渐完善这个例子来说一下我的理解吧(代码尽量简单点,如果看后面那个.NET 例子,有很多代码干扰较 大)。分为以下三个部分:  1.实现 Engine.Create(“solar”)创建 SolarEngine 实例  2.通过 Engine.Create(),不需要更改已经写好的模块自动创建所需对象  3. “惯例优于模式”    先来看代码: 

文档评论(0)

skvdnd51 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档