设计模式-原型模式与模板方法模式的对比总结
【摘要】
前言: 前面几个设计模式几乎都是以代码的形式进行汇总,和解析具体的流程。这节原型模式和模板方法模式大致上我觉得是有很多相似的地方,所以就来总结下,那些地方相同。那些地方不同!
对比:
相同点:
1,...
前言:
前面几个设计模式几乎都是以代码的形式进行汇总,和解析具体的流程。这节原型模式和模板方法模式大致上我觉得是有很多相似的地方,所以就来总结下,那些地方相同。那些地方不同!
对比:
相同点:
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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
/// <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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
客户端:
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
结果:
试卷:(模板方法模式)
需求:
所有同学考试用同一份试卷,只是提交的答案不同而已。
类图:
实现:
试卷
/// <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 "";
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
//学生甲抄的试卷
public class TextPaterA:TextPaper
{
//重写答案
protected override string Answer1()
{
return "b";
}
protected override string Answer2()
{
return "c";
}
protected override string Answer3()
{
return "a";
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
//学生乙抄的试卷
public class TestPaperB:TextPaper
{
//重写答案
protected override string Answer1()
{
return "c";
}
protected override string Answer2()
{
return "a";
}
protected override string Answer3()
{
return "a";
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
客户端:
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
结果:
总结:
从两个例子大体上就可以看出来,原型模式和模板方法模式的不同之处。原型模式修改的范围比较大,而模板方法模式修改的范围非常的小。
文章来源: kangshihang.blog.csdn.net,作者:康世行,版权归原作者所有,如需转载,请联系作者。
原文链接:kangshihang.blog.csdn.net/article/details/103037762
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)