设计模式之原型模式

来源:互联网 发布:动画ppt制作软件 编辑:程序博客网 时间:2024/05/21 00:20

c#原型模式

1、定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要任何创建的细节。

2、深复制和浅复制

1.深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象
2.被复制对象的所有对象都含有与原来对象相同的值,而所有的对其他对象的引用都任然指向原来的对象

3、实现原理

  1. UML类图
    这里写图片描述
    2.代码实现
 //抽象的原型类   abstract class AProtoType    {        private string id;        public AProtoType(string id)        {            this.id = id;        }        public string ID        {            get { return id; }        }        //Clone()方法,抽象的关键        public abstract AProtoType Clone();    }
  //具体的原型类    class ConcreteProtoTypeA : AProtoType    {        public ConcreteProtoTypeA(string id) : base(id)        {        }        public override AProtoType Clone()        {            //创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。            //如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;            //因此原始对象及其副本引用同一个对象            return (AProtoType)this.MemberwiseClone();        }    }

客户端:

  class Program    {        static void Main(string[] args)        {            ConcreteProtoTypeA ct = new ConcreteProtoTypeA("123");            //克隆类ConcreteProtoTypeA的对象ct能得到新的实例copy            ConcreteProtoTypeA copy =(ConcreteProtoTypeA) ct.Clone();            Console.WriteLine("Cloned:{0}",copy.ID);            Console.ReadKey();        }    }

输出:Cloned:123

4、实例

简历的原型实现:
4.1UML类图
这里写图片描述
4.2代码实现

 //简历类,实现可复制接口    class PersonResume : ICloneable    {        private string name;        private string sex;        private string age;        private string timeArea;        private string company;        public PersonResume(string name)        {            this.name = name;        }        //设置个人信息        public void SetInfo(string sex,string age)        {            this.age = age;            this.sex = sex;        }        //设置工作经历        public void WorkExprience(string timearea,string company)        {            this.timeArea = timearea;            this.company = company;        }        //显示        public void Show()        {            Console.WriteLine("{0},{1},{2}",name,sex,age);            Console.WriteLine("{0},{1}",timeArea,company);        }        //实现接口的方法,用来克隆对象        public object Clone()        {            return (object)this.MemberwiseClone();        }    }

客户端:
class Program
{
static void Main(string[] args)
{
PersonResume pr = new PersonResume(“DZB”);
pr.SetInfo(“Man”,”18”);
pr.WorkExprience(“Three years”,”WKD”);

        PersonResume copy = (PersonResume)pr.Clone();        copy.WorkExprience("Four Years","WKDCY");        pr.Show();        copy.Show();        Console.ReadKey();    }}

输出:DZB Man 18 Three years WKD
DZB Man 18 Four years WKDCY

5、源代码

设计模式之原型模式

原创粉丝点击