设计模式-原型模式与模板方法模式的对比总结
前言:
前面几个设计模式几乎都是以代码的形式进行汇总,和解析具体的流程。这节原型模式和模板方法模式大致上我觉得是有很多相似的地方,所以就来总结下,那些地方相同。那些地方不同!
对比:
相同点:
1,都有模板的特性
原型模式 | 模板方法模式 |
---|---|
以自身为模板创建新的对象 | 以标准统一的模板,创建新对象。 |
2,都是通过修改部分参数创建新的对象
原型模式 | 模板方法模式 |
---|---|
修改大部分的内容,只是格式不变而已。 | 只是修改了局部,一小部分的参数。 |
不同点:
1 模板对象不同
原型模式 | 模板方法模式 |
---|---|
以自身为模板 | 统一标准模板 |
2 修改范围
原型模式 | 模板方法模式 |
---|---|
修改的是宏观的变化 | 修改的是微观的变化 |
3复制(原型模式特有的)
前提:赋值内容的数据类型是引用类型
深复制 | 浅复制 |
---|---|
把数据的格式和内容完全复制 | 只复制数据的引用部分 |
例子对比:
简历:(原型模式)
需求:
对于同一个人的简历,进行不同内容的修改。
类图:
实现:
//简历public class Resume : ICloneable{private string name;private string sex;private string age;private WorkExperience work;//引用工作经历对象public Resume(string name){this.name = name;work = new WorkExperience();//实例化工作经历}private Resume(WorkExperience work){this.work = (WorkExperience)work.Clone();//调用克隆方法}//设置个人信息public void SetPersonalInfo(string sex, string age){this.sex = sex;this.age = age;}//设置工作经历public void SetWorkExperience(string workDate, string company){//给工作经历的类,里的两个属性赋值。work.WorkDate = workDate;work.Company = company;}//显示public void Display(){Console.WriteLine("{0}{1}{2}",name,sex,age);Console.WriteLine("工作经历:{0}{1}",work.WorkDate,work.Company);}//克隆public object Clone(){Resume obj = new Resume(this.work);//调用私有构造函数//给别属性赋值obj.name = this.name;obj.sex = this.sex;obj.age = this.age;return obj;}}
/// <summary>/// 工作经历类/// </summary>public class WorkExperience:ICloneable{private string workDate;public string WorkDate{get { return workDate; }set { workDate = value; }}private string company;public string Company{get { return company; }set { company = value; }}public object Clone(){return (object)this.MemberwiseClone();}}
客户端:
class Program{static void Main(string[] args){Resume a = new Resume("大鸟");a.SetPersonalInfo("男", "29");a.SetWorkExperience("1998-2000", "xx公司");Resume b = (Resume)a.Clone();//克隆b.SetWorkExperience("1998-2000", "yy公司");Resume c = (Resume)a.Clone();c.SetPersonalInfo("男", "24");c.SetWorkExperience("1998-2000", "zz公司");//显示a.Display();b.Display();c.Display();Console.Read();}}
结果:
试卷:(模板方法模式)
需求:
所有同学考试用同一份试卷,只是提交的答案不同而已。
类图:
实现:
试卷/// <summary>/// 金庸小说考试题/// </summary>public class TextPaper{public void TestQuestion1(){//试题Console.WriteLine("杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[]a.球磨铸铁b.马口铁c.高速合金钢d.碳素纤维");//答案Console.WriteLine("答案:" + Answer1());}/// <summary>/// 答案/// </summary>/// <returns>返回子类的答案</returns>protected virtual string Answer1(){return "";}public void TestQuestion2(){Console.WriteLine("杨过,程英,陆无双铲除了青花,造成[]a.是这种植物不再害人b.使一种宗珍贵稀物灭种c.破坏了哪个生物圈的生态平衡d.造成该地区沙漠化");Console.WriteLine("答案:"+Answer2());}/// <summary>/// 答案/// </summary>/// <returns>返回子类的答案</returns>protected virtual string Answer2(){return "";}public void TestQuestion3(){Console.WriteLine("蓝凤凰致使华山师徒,桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[]a.阿司匹林b.牛黄解毒丸c.佛吹算d.让他们喝大量的生牛奶e.一上全不对");Console.WriteLine("答案:"+Answer3());}/// <summary>/// 答案/// </summary>/// <returns>返回子类的答案</returns>protected virtual string Answer3(){return "";}}
//学生甲抄的试卷public class TextPaterA:TextPaper{//重写答案protected override string Answer1(){return "b";}protected override string Answer2(){return "c";}protected override string Answer3(){return "a";}}
//学生乙抄的试卷public class TestPaperB:TextPaper{//重写答案protected override string Answer1(){return "c";}protected override string Answer2(){return "a";}protected override string Answer3(){return "a";}}
客户端:
class Program{static void Main(string[] args){Console.WriteLine("学生甲抄的试卷");TextPaper studentA = new TextPaterA();studentA.TestQuestion1();studentA.TestQuestion2();studentA.TestQuestion3();Console.WriteLine("学生乙抄的试卷");TextPaper studentB = new TextPaterA();studentB.TestQuestion1();studentB.TestQuestion2();studentB.TestQuestion3();Console.Read();}}
结果:
总结:
从两个例子大体上就可以看出来,原型模式和模板方法模式的不同之处。原型模式修改的范围比较大,而模板方法模式修改的范围非常的小。
设计模式-原型模式与模板方法模式的对比总结相关推荐
- 设计模式C++实现(5)——原型模式、模板方法模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...
- 设计模式C++实现(4)——原型模式、模板方法模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...
- JAVA设计模式(14) —行为型模板方法模式(Template Method)
1 定义: 模板方法模式(Template Method) Define the skeleton of an algorithm in anoperation, deferring some ste ...
- java 模板方法_设计模式(java实现)_模板方法模式(Template method)
设计模式(java实现)_模板方法模式(Template method) 模板方法模式是编程中经常用到到的模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个 ...
- python设计模式【7】-模板方法模式
UML类图简介 设计模式的分类 面向对象的设计原则 python设计模式[1]-单例模式 python设计模式[2]-工厂模式 python设计模式[3]-门面模式 python设计模式[4]-代理模 ...
- Java设计模式——行为型模式:模板方法模式
例如,去银行办理业务一般要经过以下4个流程:取号.排队.办理具体业务.对银行工作人员进行评分等,其中取号.排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人 ...
- 大话设计模式(8)模板方法模式
一.场景及UML图 场景:有点类似于原型模式,不过侧重点不一样.模板方法重点是体现在代码复用.把一些重复性的机制代码全部抽离到父类. 二.概念 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延 ...
- Java设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]...
模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override). 1 2{<HeadFirst设计模式>之模板方法模式 } 3{ 编译工具: Del ...
最新文章
- Matlab绘图基础
- 鑿婂瓙鏇版祴璇曡崏绋縶29C28FD771BA4B0D8693}
- 九度 1462:两船载物问题(01背包)
- 多目标分类的混淆矩阵_用于目标检测的混淆矩阵
- Catalan数总结
- 一窥 ARM 的 AI 处理器
- Spring4Shell 漏洞已遭Mirai 僵尸网络利用
- 10.Linux 高性能服务器编程 --- 信号
- 一张图看明白金融数据架构
- 当不知轴承型号时如何寻找轴承故障频率_趣说滚动轴承的故障诊断
- linux使用jinja2模板_Jinja2 教程
- 总结淘宝客应该注意的佣金陷阱
- finecms V5 会员头像任意文件上传漏洞 附修复代码
- java 手机智能拨号_智能拨号 CeleDial v1.8
- 阿里物联网平台(IOT)——业务服务器获取阿里iot平台接入设备的实时设备采集数据
- MySQL数据库——备份与恢复
- 秉火stm32f429移植u-boot
- 股神大家了解多少?深度剖析股神巴菲特
- jQuery实现购物车
- 5、迪米特法则(Law of Demeter)
热门文章
- python异步socket接收_Python简易聊天工具-基于异步Socket通信
- Python 爬取新浪财经 7x24(1): 下载数据
- 要把微博、贴吧变成即时聊天,总共分几步?
- WhatsUp v14.4 新特性
- 2021年转运必看,如何彻底改变财运差和婚姻苦!
- dnf超时空漩涡副本路线流程图_DNF:超时空旋涡攻略,如何快速通关副本?
- Microsoft 群集服务 (MSCS) 简介
- 学生信息管理系统之 添加用户流程
- 你和月薪6位数的人,差距究竟在哪里?「用户案例」
- # js设置键名和键值de坑