美文网首页学习设计模式
6,原型模式(Prototype)

6,原型模式(Prototype)

作者: Kenny丶Mo | 来源:发表于2017-09-24 16:40 被阅读15次

    1,定义

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

    2,基本代码

     abstract class Prototype
        {
            private string id;
    
            // Constructor 
            public Prototype(string id)
            {
                this.id = id;
            }
    
            // Property 
            public string Id
            {
                get { return id; }
            }
    
            public abstract Prototype Clone();
        }
    
        class ConcretePrototype1 : Prototype
        {
            // Constructor 
            public ConcretePrototype1(string id)
                : base(id)
            {
            }
    
            public override Prototype Clone()
            {
                // Shallow copy 
                return (Prototype)this.MemberwiseClone();
            }
        }
    
    
        class ConcretePrototype2 : Prototype
        {
            // Constructor 
            public ConcretePrototype2(string id)
                : base(id)
            {
            }
    
            public override Prototype Clone()
            {
                // Shallow copy 
                return (Prototype)this.MemberwiseClone();
            }
        }
    
    // 调用
            static void Main(string[] args)
            {
                ConcretePrototype1 p1 = new ConcretePrototype1("I");
                ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
                Console.WriteLine("Cloned: {0}", c1.Id);
    
                ConcretePrototype2 p2 = new ConcretePrototype2("II");
                ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone();
                Console.WriteLine("Cloned: {0}", c2.Id);
    
                // Wait for user 
                Console.Read();
    
            }
    

    3,简单实现

     //简历
        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;
            }
    
        }
    
        //工作经历
        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();
            }
        }
    
              // 调用
             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-2006", "YY企业");
    
                Resume c = (Resume)a.Clone();
                c.SetWorkExperience("1998-2003", "ZZ企业");
    
                a.Display();
                b.Display();
                c.Display();
    
                Console.Read();
    
            }
    

    4,关于原型模式的思考

    1,深复制,浅复制
    浅复制:被复制对象的所有的变量都含有与原来的对象相同的值,而所有的对其他对象的引用都指向原来的对象
    深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象
    2,System的ICloneable()接口
    MemberwiseClone() 方法:如果字段是值类型的,则对该字段进行逐位复制,如果字段是引用类型,则复制引用但是不复制引用对象,因此,原有对象及其复本引用同一对象

    相关文章

      网友评论

        本文标题:6,原型模式(Prototype)

        本文链接:https://www.haomeiwen.com/subject/qwnkextx.html