设计模式-原型模式与模板方法模式的对比总结

举报
ksh1998 发表于 2021/12/25 23:46:33 2021/12/25
【摘要】 前言: 前面几个设计模式几乎都是以代码的形式进行汇总,和解析具体的流程。这节原型模式和模板方法模式大致上我觉得是有很多相似的地方,所以就来总结下,那些地方相同。那些地方不同! 对比: 相同点: 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。