zoukankan      html  css  js  c++  java
  • 原型模式(Prototype)

    重要概念回顾

    1. 原型模式用原型实例(类中有一个复制自己的方法)指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    image

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

    3.对于.Net 在System命名空间中提供了ICloneable 接口,其中有一个唯一的方法就是Clone()。所以只需要实现这个接口就可以完成原型模式了,代替了上图中的Prototype抽象类。

    4. 一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。

    5. 不用重新初始化对象,而是动态地获得对象当前运行时的状态。

    浅复制与深复制

    6.MemberwiseClone()方法是这样,如果字段是值类型的,则对该值执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原型对象及其副本引用同一个对象。如果有对象类型的引用成员,那么引用的对象数据是不会被克隆的。

    7.浅复制不会去复制引用类型的对象,而是仅仅复制了引用本身。被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然只想原来的对象。

    8.深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象,所以存在一个层次复制的问题,就是引用中包含引用,需要一层一层的都复制了。

    9.DataSet 中的Clone()方法实现了浅复制,仅拷贝结构。Copy()方法实现了深复制,除结构外还包含数据。

    10.在类中继承ICloneable 接口实现Clone方法,自己复制自己叫做原型模式

    基础示例

    浅复制

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace 原型模式
    {
        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-2006", "YY企业");
    
                Resume c = (Resume)a.Clone();
                c.SetPersonalInfo("男", "24");
                c.SetWorkExperience("1998-2003", "ZZ企业");
    
                a.Display();
                b.Display();
                c.Display();
    
                Console.Read();
            }
        }
    
        //简历
        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
        {
            private string workDate;
            public string WorkDate
            {
                get { return workDate; }
                set { workDate = value; }
            }
            private string company;
            public string Company
            {
                get { return company; }
                set { company = value; }
            }
        }
    
    }

    深复制

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    
    namespace 原型模式
    {
        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-2006", "YY企业");
    
                Resume c = (Resume)a.Clone();
                c.SetWorkExperience("1998-2003", "ZZ企业");
    
                a.Display();
                b.Display();
                c.Display();
    
                Console.Read();
    
            }
        }
    
        //简历
        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();
            }
        }
    
    }
    冯瑞涛
  • 相关阅读:
    面向对象的静态属性和静态方法
    面向对象魔术方法及类的自动加载
    面向对象
    mysql cmd 创表查表练习
    创建表 查询表以及添加数据
    windows cmd命令
    4.20 mysq数据库 创建表
    cmd控制数据库初步了解
    Jquery初步了解
    故宫博物院项目 JS功能整理
  • 原文地址:https://www.cnblogs.com/finehappy/p/1614464.html
Copyright © 2011-2022 走看看