




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c+工厂模式 1、 传授设计模式中存在的问题我个人最近对设计模式中的工厂模式进行了比较深入的学习,通过学习感悟出现在很多设计模式传道者,在讲述设计模式的过程中存在一些问题,使得设计模式变得很难理解。设计模式本身很抽象,但是这些传道者在讲述的过程中,将一个抽象的东西讲的更抽象,从而使我们望而却步。有些人在讲述的时候,没有考虑读者的注意力。比如我在看C#设计模式的时候,在讲述抽象工厂模式的时候,直接就进入了一个示例,而且这个例子比较复杂,涉及了比较多的概念、术语,而且还有算法要处理。但是这些和要讲述的核心内容无关,我想要看懂他的示例就要将这个东西都搞懂,就分散了我的注意力。我个人总结,学习设计模式的方法是,首先找到一个突破口,比如可以先学习构造型模式中简单的模式,将它理解、熟练应用。通过对一、两个模式有一个深入的认识之后,再学习其它比较复杂一点的模式就容易多了,这是一种迭代的思想在学习中的应用。另外学习任何一种设计模式的过程应该是具体抽象再具体这个的一个过程。这句话的意思是首先通过一个比较具体一点的例子来帮助理解设计模式,在理解之后将你的理解扩展到解决这一类问题,上升到一定的理论高度。然后就是再到具体,也就是应用设计模式,应用理论解决自己遇到的实际问题。2、学习工厂模式的预备知识:首先声明这些预备知识并不是工厂模式仅仅需要,因为我先讲述工厂模式,所以在学习工厂模式之前将这些问题提出。2.1 Upcasting:Upcasting中文翻译有好几个,比如向上类型转换、向上转型、上溯造型。我个人比较喜欢向上转型这个翻译,即简单又含义明确。向上转型这个概念,我在Bruce Eckel在的Thinking in c+、Thinking in Java中都看到过,我不是很确定这个概念是否是他提出来的。向上转型是将把一个派生类当作它的基类使用。我们将一个更特殊的类型转换到一个更常规的类型,这当然是安全的。派生类是基类的一个超集。它可以包含比基类更多的方法,但它至少包含了基类的方法。向上转型给我们带来的好处就是我们可以将不同的派生通过一种统一的方式进行处理。向上转型带来的弊端就是我们向上转型的过程会丢失派生类的接口。既然有向上转型,也就有向下转型即DownCasting我们在此不做详细讨论。下面使用一个例子来示例向上转型。 public class Base public void Test() MessageBox.Show(OK); public class Derive:Base private void button1_Click(object sender, System.EventArgs e) Base b=new Derive(); b.Test(); 在有名的OOD的设计原则中有一个叫做里氏代换原则(Liskov Substitution Principle, LSP)。它的实质也就是讲向上转型。它的内容是:任何接收父类型的地方,都应当能够接收子类型,换句话说如果使用的是一个基类的话,那么一定适用于其子类,而且程序察觉不出基类对象和子类对象的区别。LSP是继承复用的基石,只有当派生类可以替换掉基类,软件的功能不受到影响时,基类才能真正被复用。2.2 多态我不敢想象离开了多态后的设计模式是一个什么样子。什么是多态,我喜欢总结这样一句话来回答这个问题,“一个接口,多种实现”。注意这里的接口不仅仅表示Interface关键字,是广义上的接口。在C#中实现接口我们有两种途径,一种是借助继承来实现,一种是借助Interface来实现。3、工厂设计模式理论3.1 概述工厂模式具体包括了简单工厂、工厂方法、抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型,其中简单工厂并不属于GOF的23中模式。但是它是理解其它的工模式的一个很好的基础,所以很多人在讲述设计模式的时候会提到简单工厂模式。创建型模式关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑。3.2 不使用任何模式我们现在有这样的一个设计,影像家电(VideoWiring)包括了DVD、VCD。在基类VideoWiring中有PlayVideo方法,子类重载了这个方法。我们如何来调用PlayVideo进行播放呢。我们可以看到下面的代码可以实现。publicabstractclassVideoWiringpublicabstractstringPlayVideo();publicclassVCD:VideoWiringpublicoverridestringPlayVideo()return正在播放播放VCD;publicclassDVD:VideoWiringpublicoverridestringPlayVideo()return正在播放播放DVD;下面是调用对象的方法进行播放的代码:dvd.PlayVideo();这样的语句。privatevoidPlayVideo()DVDdvd=newDVD();MessageBox.Show(dvd.PlayVideo();VCDvcd=newVCD();MessageBox.Show(VCD.PlayVideo();上面的代码可以实现功能但是不好,为什么呢?类实现了多态,但是我们在调用的时候并没有利用多态。如果我们有很多的影像家电产品,就需要写很多的类似下面是使用多态完成播放功能的代码:privatevoidPlayVideo()VideoWiringvw;vw=newDVD();Play(vw);vw=newVCD();Play(vw);privatevoidPlay(VideoWiringvw)stringstr=vw.PlayVideo();MessageBox.Show(str);无论是什么影像家电产品,我们都可以使用一个统一的方式进行播放,即vw.PlayVideo()。 我们再讨论一下,上面的代码存在的问题。虽然上的代码很短,应该不会有问题,但是我们定位的目标应该更高些,应该考虑怎样达到良好的封装效果,减少错误修改的机会。我们自然的应该考虑对象创建的问题了,能不能让不同的影像家电产品的创建方式相同,而且这个创建过程对使用者封装,也就是说让对象的创建象播放功能那样简单、统一。如果能够实现,会给我们的系统带来更大的可扩展性和尽量少的修改量。“哇!那该多好呀”。“不要羡慕了,来看看简单工厂模式,听说它能够实现”。3.3 简单工厂模式我们使用简单工厂对上面的代码继续改进,根据上面的分析我们考虑对对象创建进行近一步的封装。使用一个类专门来完成对对象创建的封装,这个类我们称为工厂,因为它的作用很单一就生成出一个个的类。下面是一个工厂类的示例代码:publicclassCreatepublicstaticVideoWiringfactory(stringVideoName)switch(VideoName)caseDVD:returnnewDVD();caseVCD:returnnewVCD();returnnull;这样我们的客户端代码又可以更加有效简洁了:注意:在上面的两段代码示例中我们就已经使用了向上转型。首先注意在Create类的factory方法中使用了return new DVD();这样的语句,但是这个函数的返回值却是VideoWiring,它DVD类的基类。所以我们的客户程序才可以使用VideoWiring vw=Create.factory(DVD)这样的语句。这样客户程序并不关心创建是如何完成的,以及创建的对象是什么,我们都可以调用基类统一的接口实现他们的功能。使用UML表示如下图所示:privatevoidPlayVideo()VideoWiringvw=Create.factory(DVD);vw.PlayVideo();vw=Create.factory(VCD);vw.PlayVideo();我们将工厂模式推广到一般的情况,它的类图如下所示:角色说明:工厂类(Creator):根据业务逻辑创建具体产品,由客户程序直接调用。抽象产品(Product):作为具体产品的基类,提供统一的接口,也是工厂类要返回的类型。具体产品(Concrete Product):工厂类真正要创建的类型。上图中仅仅展示了一个具体产品,有多个产品的时候类似。下面
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年粮油食品检验人员通关考试题库附参考答案详解(研优卷)
- 农发行南昌市东湖区2025秋招笔试英语题专练及答案
- 2025年园林绿化作业人员全真模拟模拟题(名师系列)附答案详解
- 2025年心理健康心理问题咨询案例分析答案及解析
- 2025年整形外科手术切口处理规范试题答案及解析
- 农发行鸡西市鸡东县2025秋招结构化面试15问及话术
- 2025年肿瘤内科化疗药物应用试题答案及解析
- 深圳市2025中共深圳市宝安区委宣传部面向市内区外选调事业单位人员4人广东笔试历年参考题库附带答案详解
- 农发行保定市定兴县2025秋招结构化面试经典题及参考答案
- 2025年自考专业(电子商务)经典例题及完整答案详解(有一套)
- 2025年质量月知识竞赛题库(附答案)
- 酒店电气使用安全培训课件
- 生猪订购合同书范本3篇
- 2025年妇产科学科宫颈癌筛查常见问题考试答案及解析
- 排球规则课件
- 软件人员外包合同
- 上海区域出租车考试题目及答案
- 2025部编版三年级道德与法治上册全册教案
- 三国趣味考试题库及答案
- 2024年房地产经纪协理考试题库及完整答案1套
- 2025年初级电工接线技能模拟题及答案详解
评论
0/150
提交评论