《大话设计模式》学习笔记6:原型模式

  

说明:1..NET在System命名空间中提供了ICloneable接口,其中只有唯一的一个方法Clone(),只需要实现这个接口就可以完成原型模式。【即上图中Prototype用ICloneable代替】

   2.MemberwiseClone():创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。 如果字段是值类型的,则对该字段执行逐位复制。 如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。【对于内部的Class对象和数组,则Copy一份地址;而对于其它内置的int/string/enum/struct/object类型,则Copy一份值(参考:C# 浅拷贝与深拷贝区别)】

一、简历复印示例:

  

1.具体原型类:

    public class Resume:ICloneable
    {
        private string name;
        private string timeArea;
        private string company;

        public Resume(string name)
        {
            this.name = name;
        }
        public void SetWorkExperience(string timeArea,string company)
        {
            this.timeArea = timeArea;
            this.company = company;
        }
        public void Display()
        {
            Console.WriteLine("{0} 工作经历:{1} {2}", name,timeArea, company);
        }
        public object Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }

2.客户端调用:

    class Program
    {
        static void Main(string[] args)
        {
            Resume a = new Resume("a");
            a.SetWorkExperience("1998-2000", "X公司");

            Resume b = (Resume)a.Clone();
            b.SetWorkExperience("1998-2006", "Y公司");

            a.Display();
            b.Display();
        }
    }

二、简历的深复制示例:

  

  说明:参考上图若Resume类中包含WorkExperience类,则在上面的[简历复印示例]中,Resume复制对WorkExperience的复制为浅复制,不同的Resume对象对WorkExperience指向同一个引用。

1.原型包含类:

    public class WorkExperience:ICloneable
    {
        public string WorkDate { get; set; }
        public string Company { get; set; }

        public object Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }

2.具体原型类:

    public class Resume:ICloneable
    {
        private string name;
        private WorkExperience workExperience;

        public Resume(string name)
        {
            this.name = name;
            workExperience = new WorkExperience();
        }

        //提供Clone方法调用的私有构造函数,以便克隆“工作经历”的数据
        private Resume(WorkExperience workExperience)
        {
            this.workExperience = (WorkExperience)workExperience.Clone();
        }
        public void SetWorkExperience(string workDate,string company)
        {
            workExperience.WorkDate = workDate;
            workExperience.Company = company;
        }
        public void Display()
        {
            Console.WriteLine("{0} 工作经历:{1} {2}", name,workExperience.WorkDate, workExperience.Company);
        }
        public object Clone()
        {
            Resume resume = new Resume(this.workExperience);
            resume.name = this.name;
            return resume;
        }
    }

3.客户端调用:

    class Program
    {
        static void Main(string[] args)
        {
            Resume a = new Resume("a");
            a.SetWorkExperience("1998-2000", "X公司");

            Resume b = (Resume)a.Clone();
            b.SetWorkExperience("1998-2006", "Y公司");

            a.Display();
            b.Display();
        }
    }

原型模式其实就是从一个对象再创建另外一个可定制的对象,而不需要知道任何创建的细节。

时间: 2024-08-29 22:50:53

《大话设计模式》学习笔记6:原型模式的相关文章

大话设计模式读书笔记--6.原型模式

简单的复制粘贴极有可能造成重复代码的灾难, 但是java中提供了克隆的功能, 如果一个对象创建过程复杂,又要频繁使用, 在初始化信息不发生变化的情况下,应当采取克隆而不是new一个对象 定义 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 也就是说, 只需知道原型对象的类型,就可以拷贝, 拷贝分为浅拷贝和深拷贝,可参考浅拷贝和深拷贝 模式结构 Prototype: 抽象原型类,声明克隆接口 ConcretePrototypeA: 具体的原型类, 实现克隆操作 模式实现

[大话设计模式]学习笔记——简单工厂模式

序 说好的每天进步一点点的,结果工作太忙,一直在加班,都没有学习新东西.我还要进BAT呢. 坚持每天学习新东西. 写代码时,意识到在代码结构上还是有点欠缺.赶紧补上. 纪录对设计模式的认识.小菜变大鸟.进攻BAT. 应用场景: 编写一个计算器控制台程序,要求输入两个数和运算符号,得到结果. 这本书使用C#写的.已有博主用JAVA写出来,参考:http://blog.csdn.net/ghsau/article/details/8163418 常见的做法: 写一个方法封装计算机的功能,我们只需传参

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

设计模式学习笔记--备忘录(Mamento)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--状态(State)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--迭代(Iterator)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--访问者(Visitor)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

大话设计模式学习笔记

大话设计模式笔记 1. 使用简单工厂模式(使用反射可以解决避免分支判断问题) 注重创建不同的对象 2. 使用策略模式处理 不同的时间应用不同的业务规则 3. 单一原则:一个类仅有一个变化的原因  发现职责并把职责分离 4. 开放-封闭原则:软件实体可以扩展但不能修改  对扩展开放 对更改封闭 开发人员对程序中呈频繁变化的那部分做出抽象 5. 依赖倒转原则: A.高层模块不应依赖底层模块.两者都应该依赖抽象. B.抽象不应该依赖细节,细节应该依赖于抽象.即针对接口编程, 不应针对实现编程. 里氏替

设计模式学习笔记--工厂方法模式

学习过简单工厂模式,感觉很好用.在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码.大大的减少了代码修改的难度.而且可以通过参数不同,创建不同的对象. 但是简单工厂模式也有一些弊端,违背了开放--封闭原则.即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展.所以就有了下面的工厂方法模式: 工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类. // 设计模式Dem