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

    原型模式:用原型实例指定要创建对象的实例,并通过拷贝哲学原型创建新的对象。

    结构图:

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

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace ConsoleApplication1
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             ConcreatePrototype p = new ConcreatePrototype("I");
    14             ConcreatePrototype p2 = (ConcreatePrototype)p.Clone();
    15             Console.WriteLine("Cloned: {0}", p2.Id);
    16         }
    17     }
    18     abstract class Prototype
    19     {
    20         private string id;
    21         public Prototype(string id)
    22         {
    23             this.id = id;
    24         }
    25         public string Id {
    26             get { return id; }
    27         }
    28         public abstract Prototype Clone();
    29     }
    30     class ConcreatePrototype :Prototype
    31     {
    32         public ConcreatePrototype(string id):base(id)
    33         {
    34         }
    35         public override Prototype Clone()
    36         {
    37             return (Prototype)this.MemberwiseClone();
    38         }
    39     }
    40 }
    View Code

    克隆的操作是调用MemberwiseClone()方法,创建的是当前对象的浅表副本,方法是创建一个新对象,将当前对象的非静态字段复制到新对象。

    如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但不复制引用的对象;因此,原始对象及其副本引用的是同一对象。(也就是说引用的时候对象只有一份,多次修改后以最后一次为主),这时的操作叫做浅拷贝,即被复制对象的所有变量都含有雨原来的对象相同的值,而所有的对其他对象的引用都依然指向原来的对象

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

  • 相关阅读:
    dependencyManagement、parent与dependencies
    maven和gradle中,dependency和plugin的区别
    SpringMVC与Struts2区别
    RESTful风格与RESTful Api
    DBCP连接池配置参数
    js 函数的传值问题
    js 重载i
    js 对象与函数的区别
    子窗口 父窗口传值
    验证码
  • 原文地址:https://www.cnblogs.com/virus1102/p/GoF_Protopyte.html
Copyright © 2011-2022 走看看