




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+设计模式教程第三讲:Builder和Prototype模式主讲人:步磊峰 UIPower 3D界面引擎负责人第一节: Builder模式定义2定义: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。 这样的设计模式被称为建造者模式。 那么如何理解这句话的含义呢? 我们仍旧使用汽车制造的例子来进行相关的演示。 第二节: Builder模式例子3 1、汽车的是一个复杂的产品,一个汽车公司组装一辆汽车,需要一定的步骤,例如需要组装引擎,底盘以及轮子 等。 2、专业的事情由专业的公司,例如引擎可以由专业的生产商,例如劳斯莱斯,通用汽车等生产。 同样的轮胎可以由普利司通或米其
2、林等专业公司进行生产。汽车厂商很多时候是将专业公司生产的部件组合起 来,从而组装成成车。 这意味着不同的汽车生产商使用相同的部件。 那么我们来定义Car的数据结构,代表着一个复杂的产品。 第二节: Builder模式例子4 第二节: Builder模式例子5 第二节: Builder模式例子6 3、将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。 前面定义了一个复杂对象Car。根据定义,Car的构造与它的表示分离。意味着,Car我们仅仅定义了它的表示, 是由生产厂商信息以及引擎,底盘和轮子组成,但是如何构造它并不是在Car的构造器中进行构造,而是使用引 进一个构造器来来
3、进行复杂对象Car的构造。 根据定义,使用同样的构造过程可以创建不同的表示。 这句话的意思意味着构造器构造复杂对象Car是具有一定的流程的,而且在Builder的过程中,可以创建出不同汽 车厂商生产的汽车,同一生产商的汽车使用各个专业公司生产的引擎或轮胎等等。或者不同的汽车生产厂商生产 出来的汽车使用同一专业公司的引擎或轮胎等等。 这些都意味着创建不同的表示(Car的不同表示)。 第二节: Builder模式例子7 4、由此可见,Builder模式的核心是: 复杂产品的表示与创建分离。 强调创建的过程或流程是有步骤的,甚至可以强制要求有先后顺序。 产品的不同表现形式不是通过产品继承扩展而来的,
4、而是通过继承扩展创建器而来的。 第二节: Builder模式例子8 第二节: Builder模式例子9通过Builder创建产品通过继承Builder创建产品的不同表示:此处创建的是通用汽车的产品 第二节: Builder模式例子10通过Builder创建产品通过继承Builder创建产品的不同表示:此处创建的是福特汽车的产品 第二节: Builder模式例子11我们再定义指导类用于简化创建过程 定义测试函数 第二节: Builder模式一个简单例子12第三节: 创建者模式和工厂模式的区别13 Factory模式中: 1、有一个抽象的工厂。 2、实现一个具体的工厂-汽车工厂。 3、工厂生产汽车
5、A,得到汽车产品A。 4、工厂生产汽车B,得到汽车产品B。 这样做,实现了购买者和生产线的隔离。强调的是结果。 Builder模式: 1、引擎工厂生产引擎产品,得到汽车部件A。 2、轮胎工厂生产轮子产品,得到汽车部件B。 3、底盘工厂生产车身产品,得到汽车部件C。 4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。 5、将这个整体送到汽车组装工厂,得到一个汽车产品。 这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程。 第三节: 创建者模式和工厂模式的区别14 两者的区别在于: Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。 Builder模式先一个
6、个的创建对象的每一个部件,再统一组装成一个对象。 Factory模式所解决的问题是,工厂生产产品。 而Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。 Builder模式不是很常用。模式本身就是一种思想。知道了就可以了。 设计模式就是一种思想。学习一个模式,花上一两个小时把此模式的意思理解了,就 够了。其精华的所在会在以后工作的设计中逐渐体现出来。 第四节: 创建者模式描述15 1、意图: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。 2、结构: 第四节: 创建者模式描述16 3、参与者: 1) Builder:为创
7、建一个产品对象的各个部件指定抽象接口。 2) ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。 3) Director:构造一个使用Builder接口的对象。 4) Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定 义组成部件的类,包括将这些部件装配成最终产品的接口。 4、 适用: 1) 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2) 当构造过程必须允许被构造的对象有不同表示时。 第五节: 原型模式定义17定义
8、: 用原型实例指定创建对象的种类,并且通过拷贝原型创建新的对象。 1) Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本 无需知道任何如何创建的细节。 2) 工作原理是: 通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它 们自己来实施创建。 3) 原型模式主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧 烈的变化,但是他们却拥有比较稳定一致的接口。 第六节: 原型模式例子18 我们使用简历复制的例子来演示原型设计模式: ICloneable代表一个pr
9、ototype:定义工作经历类:第六节: 原型模式例子19 定义工作经历类:第六节: 原型模式例子20 定义简历类,继承自ICloneable原型接口:第六节: 原型模式例子21 定义简历类,继承自ICloneable原型接口:第六节: 原型模式例子22 测试程序:第七节: 原型模式中浅拷贝和深拷贝23 前面的例子貌似没什么大问题。 这是因为: 1) 所有的数据类型都是string或int ,例如Resume类的个人信息部分,除了年龄使用int类型外,其他的信息都 是使用string。string类内部的赋值使用逐字符拷贝,因此是深拷贝。而基本数据类型赋值都是独立的实例。不存 在浅拷贝的问题。
10、 2) 同样的,WorkExperience类的公司和工作年限也是使用字符串。 3) Resume的成员变量m_workExperience使用的是对象,意味着每个Resume都有一个独立的WorkExperience对 象。而没有使用共享的指针形式。 如果我们修改Resume类,不使用对象,而是使用指针方式,并且不是使用组合而是使用聚合的形式,那么我们会 发现存在很大的问题。 第七节: 原型模式中浅拷贝和深拷贝24 第七节: 原型模式中浅拷贝和深拷贝25 第七节: 原型模式中浅拷贝和深拷贝26 第八节: 实现原型模式中深拷贝27 前面的实例代码中Resum2用于一个WortExperienc
11、e指针,而WorkExperience并不是继承自ICloneable接口,现在我要实现深度拷贝,则定义一个WorkExperience2类,让其继承自IConeable接口,并实现深度拷贝的Clone方法第八节: 实现原型模式中深拷贝28然后修改Resume2类中的m_workExperience指针的类型为WorkExperience2。最后我们修改Resume2的拷贝构造函数:不需要修改Resume2的Clone方法:第八节: 实现原型模式中深拷贝29测试代码不用更改,我们运行看一下结果:第九节: 防止深度拷贝后的内存泄露30对于前面所述的内存泄露,最简单的方式是:在Resume2中添加
12、一个方法:然后在需要内存释放的时候手动的进行delete:第九节: 防止深度拷贝后的内存泄露31然后在需要内存释放的时候手动的进行delete:第九节: 防止深度拷贝后的内存泄露32我们需要实现一种机制,不管是深度Clone或浅Clone,都要能够防止内存泄露并且具有智能性,最起码当我们调用delete Resume2的时候,能够自动的将Clone出来的WorkExperience指针也能够得到释放。可能第一个反应就是修改ICloneable接口,用标记变量标记出是否是深度Clone例如:第九节: 防止深度拷贝后的内存泄露33让WorkExperience3和Resume3都继承自IClone
13、able3接口,由于重复代码比较多,我们仅演示核心部分:第九节: 防止深度拷贝后的内存泄露34对WorkExperience3和Resume3进行测试第九节: 防止深度拷贝后的内存泄露35第九节: 防止深度拷贝后的内存泄露36第九节: 防止深度拷贝后的内存泄露37前面的代码实际遇到了指针两次释放的问题,要明确指针本身的值和指向的值是不同的概念,指针NULL判断是根据自己的值进行判断,而不是判断指向的值是否为NULL。下面一段代码演示了指针的用法:由此可见,我们使用标记方式无法妥善的解由此可见,我们使用标记方式无法妥善的解决深度拷贝后的内存泄露问题。决深度拷贝后的内存泄露问题。看来只能使用智能指
14、针来解决内存泄露的问看来只能使用智能指针来解决内存泄露的问题。题。第十节: 使用智能指针防止内存泄露381、我们直接使用前面已经实现的WorkExperience2类,其继承自ICloneable,实现了深度Clone方法2、实现ResumePtr类,也继承自ICloneable第十节: 使用智能指针防止内存泄露393、其他的方法和Resume3相同代码,我们不再贴出来4、测试结果第十节: 使用智能指针防止内存泄露405、测试结果第十节: 使用智能指针防止内存泄露41结论:由此可见使用原型克隆模式面临两个主要的问题:1、如何正确的实现Clone方法,当对象结构包含循环引用时,尤为棘手。 还需要
15、考虑Clone是深度克隆还是浅Clone,这依赖于程序的需求。 2、如何对克隆后的对象的析构。上述内容其实都涉及到语言机制问题。上述两个问题在C#或Java中很容易解决,对于深度克隆或循环引用,可以使用对象序列化机制将整个对象以及所有依赖的对象递归的进行序列化到内存流中,然后从内存流反序列化到一个新的对象中,这样就完成了深度克隆。当然在C+中我们可以使用boost的序列化框架获得同样的效果。关于内存析构问题。C#或Java具有引用计数和垃圾收集功能。而C+中我们可以使用shared_ptr智能指针模拟简单的垃圾收集功能。第十一节: 原型模式描述42 1、意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 2、结构: 第十一节: 原型模式描述43 3、参与者: 1) Prototy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度家庭自用井承包使用协议
- 2025年度车间出租与智能化生产管理系统合同
- 二零二五年度文化旅游资源开发用工劳务合同模板
- 2025年度烧烤店转让合同含独家配方及设备
- 2025年度艺术品抵押借款合同协议
- 二零二五年度汽车零部件制造厂房产权移交合同
- 二零二五年度瑜伽舞蹈工作室店铺铺面租赁协议
- 发言稿组织委员
- 2025年安徽货运从业资格考试题目大全答案
- 老母亲遗留房产转让合同
- (2025春新教材)部编版七年级语文下册全册教案
- 2024年12月重庆大学医院公开招聘医生岗位2人(有编制)笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 主题班会:新学期 新起点 新期待
- 统编版历史 选择性必修二第12课 《水陆交通的变迁》课件(共27张)
- 小学生双拥活动国防教育
- 《得胜的基督新妇》课件
- 消防风道风管施工方案
- 烟囱拆除工程施工方案设计及安全措施
- 2025年湖南省烟草专卖局系统招聘336人高频重点提升(共500题)附带答案详解
- 交通安全劝导讲座课件
- 和利时DCS系统课件
评论
0/150
提交评论