设计模式-原型模式(简历复印)

简介: 设计模式-原型模式(简历复印)

原型模式定义:


用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

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


 //原型类
    abstract class Prototype
    {
        private string id;
        public Prototype(string id)
        {
            this.id = id;
        }
        public string Id
        {
            get { return id; }
        }
        //抽象类关键方法
        public abstract Prototype Clone();
    }
  //具体原型类
    class ConcretePrototypel:Prototype
    {
        public ConcretePrototypel(string id):base(id)
        {
        }
        public override Prototype Clone()
        {
            //方法重写
            return (Prototype)this.MemberwiseClone();
        }
    }

可以看到在具体类中我们实现了原型类中的克隆方法,其实在.net中克隆很常用就不必用原型类就可以直接实现克隆(刚刚知道),直接在命名空间中提供ICloneable接口就可以实现克隆了。


    static void Main(string[] args)
        {
            ConcretePrototypel p1 = new ConcretePrototypel("I");
            ConcretePrototypel c1 = (ConcretePrototypel)p1.Clone();
            Console.WriteLine("Cloned:{0}", c1.Id);
            Console.Read();
        }

下面这个是通过用了克隆接口的原型模式代码,以复制工作简历为背景故事

//简历类
 class Resume:ICloneable
    {
        private string name;
        private string sex;
        private string age;
        private string timeArea;
        private string company;
        public Resume(string name)
        {
            this.name = name;
        }
        public void SetPersonalInfo(string sex,string age)
        {
            this.sex = sex;
            this.age = age;
        }
        public void SetWorkExperience(string timeArea,string company)
        {
            this.timeArea = timeArea;
            this.company = company;
        }
        public void Display()
        {
            //实现接口的方法,用来克隆对象
            Console.WriteLine("{0} {1} {2}", name, sex, age);
            Console.WriteLine("工作经历:{0} {1}", timeArea, company);
        }
        public Object Clone()
        {
            return (Object)this.MemberwiseClone();
        }
    }
//客户端
static void Main(string[] args)
        {
            Resume a = new Resume("大鸟");
            a.SetPersonalInfo("男", "29");
            a.SetWorkExperience("1998-2000", "xx公司");
            //调用Clone方法就可以实现新简历的生成,并且可以再修改新简历的细节
            Resume b = (Resume)a.Clone();
            b.SetWorkExperience("1998-2006", "YY公司");
            Resume c = (Resume)a.Clone();
            c.SetPersonalInfo("男", "24");
            a.Display();
            b.Display();
            c.Display();
            Console.Read();
        }

这个原型模式的克隆还出现了两种不同的情况,分别是浅复制和深复制。


浅复制


如果复制的字段是 值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但不复制引用的对象。(复制引用:复制的引用地址,并没有实际复制它的对象,所以后出现复制了多个引用类型的字段并且修改后出现结果为最后修改的值)


被复制对象的所用变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然都指向原来的对象。


//工作经历类
    class WorkExperience
    {
        private string workDate;
        public string WorkDate
        {
            get { return workDate; }
            set { workDate = value; }
        }
        private string company;
        public string Company
        {
            get { return company; }
            set { company = value; }
        }
    }
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();
        }
        //设置个人信息
        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()
        {
            return (Object)this.MemberwiseClone();
        }
    }


深复制


把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。


//工作经历类
    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 Resume:ICloneable
    {
        private string name;
        private string sex;
        private string age;
        private WorkExperience work;
        public Resume(string name)
        {
            this.name = name;
            work = new WorkExperience();
        }
        //提供Clone方法调用的私有构造函数,以便于克隆工作经历的数据
        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;
        }
    }

相关文章
|
4天前
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
|
4天前
|
设计模式 Java 关系型数据库
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
|
4天前
|
设计模式 Java
Java设计模式【五】:原型模式
Java设计模式【五】:原型模式
19 0
|
6月前
|
设计模式 Java 关系型数据库
认真学习设计模式之原型模式(Prototype Pattern)
认真学习设计模式之原型模式(Prototype Pattern)
39 0
认真学习设计模式之原型模式(Prototype Pattern)
|
4天前
|
设计模式 存储
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
|
4天前
|
设计模式 Java
【设计模式系列笔记】原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而无需知道其具体类型。这种模式属于对象创建型模式,通过克隆来避免使用new关键字创建对象,提高性能和降低系统的耦合度。
33 6
|
4天前
|
设计模式 Java
小谈设计模式(10)—原型模式
小谈设计模式(10)—原型模式
|
4天前
|
设计模式 Java
23种设计模式,原型模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新的对象,而无需知道如何创建的细节。这种模式的核心思想是基于一个原型实例,通过复制这个原型来创建新的对象
27 7
|
4天前
|
设计模式 Java
设计模式之原型模式
设计模式之原型模式
|
4天前
|
设计模式 存储 JSON
Java设计模式-原型模式
原型模式也是创建对象的一种方式,它一般用在这样的场景:系统中存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂而且耗费资源。这个时候使用原型模式的克隆方式,能够节省不少时间。比如Java 类中提供的`Object clone()`就是原型模式的应用。
31 1
Java设计模式-原型模式

相关实验场景

更多