zoukankan      html  css  js  c++  java
  • 第 9 章 —— 原型模式

    9.3 原型模式

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

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

      抽象原型类:

        abstract class Prototype
        {
            private string id;
    
            public Prototype(string id)
            {
                this.id = id;
            }
    
            public string Id
            {
                get { return id; }
            }
    
            public abstract Prototype Clone();          //抽象类关键就是有这样一个Clone方法
        }

      具体原型类:

        class ConcretePrototype : Prototype
        {
            public ConcretePrototype(string id) : base(id)
            { }
    
            public override Prototype Clone()
            {
                return (Prototype)this.MemberwiseClone();       //创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,
                //则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象:因此,原始对象及其副本引用为同一对象
            }
        }

      客户端代码:

            static void Main(string[] args)
            {
                ConcretePrototype p1 = new ConcretePrototype("I");
                ConcretePrototype c1 = (ConcretePrototype)p1.Clone();       //克隆ConcretePrototype的对象p1就能得到新的实例c1
                Console.WriteLine("Cloned:{0}", c1.Id);
    
                Console.Read();
            }

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

    9.5 浅复制与深复制

        MemberwiseClone() 方法是这样的,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。换句话说就是,如果你的“简历”类当中有对象引用,

      那么引用的对象数据是不会被克隆过来的。

        举个例子你就明白了,你现在的“简历”类当中有一个“设置工作经历”的方法,在显示设计当中,一般会再有一个“工作经历”类,当中有“时间区间”和“公司名称”等属性,“简历”类直接调用这个对象即可。

      工作经历类:

          class WorkExperience
          {
              public string WorkDate { get; set; }      //好像是使用这种方式类中所有的属性都要使用这种方式,所以这种方式好像只适合那些其他方法并不调用私有变量的类
              public string Company { get; set; }
          }

      简历类:

  • 相关阅读:
    调用其他类的方法
    CString中 format、trimLeft和trimright、trim 和FindOneOf用法
    GetAsyncKeyState()& 0x8000
    C++打开剪切板,获取剪切板数据
    CString比较不区分大小写
    C++ string中find() 用法
    CString数组和CStringArray
    nested exception is java.io.FileNotFoundException: Could not open ServletContext resource
    SQLPlus获取oracle表操作SQL
    XShell实现服务器端文件的上传下载
  • 原文地址:https://www.cnblogs.com/zhangchaoran/p/8547598.html
Copyright © 2011-2022 走看看