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

前言:
前面几个设计模式几乎都是以代码的形式进行汇总,和解析具体的流程。这节原型模式和模板方法模式大致上我觉得是有很多相似的地方,所以就来总结下,那些地方相同。那些地方不同!

对比:

相同点:

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();

        }
    }

结果:
在这里插入图片描述

总结:

从两个例子大体上就可以看出来,原型模式和模板方法模式的不同之处。原型模式修改的范围比较大,而模板方法模式修改的范围非常的小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康世行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值