zoukankan      html  css  js  c++  java
  • 原型

    1:概述
          原型模式的用意是:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。
    2:C#对原型模式的支持
          在C#里面,我们可以很容易的通过Clone()方法实现原型模式。任何类,只要想支持克隆,必须实现C#中的ICloneable接口。ICloneable接口中有一Clone方法,可以在类中复写实现自定义的克隆方法。克隆的实现方法有两种:浅拷贝(shallow copy)与深拷贝(deep copy)。
          浅拷贝:是指当对象的字段值被拷贝时,字段引用的对象不会被拷贝。例如,如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅拷贝,那么两个对象将引用同一个字符串。
         深拷贝:是对对象实例中字段引用的对象也进行拷贝的一种方式,所以如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个深拷贝的话,我们将创建一个新的对象和一个新的字符串--新对象将引用新字符串。需要注意的是执行深拷贝后,原来的对象和新创建的对象不会共享任何东西;改变一个对象对另外一个对象没有任何影响。
    3:类图

    3:代码

        public class SqlHelper
        
    {
            
    public void Insert() { }
            
    public void UpDate() { }
        }


        
    public class ShallowCopy : ICloneable
        
    {
            
    private SqlHelper sqlHelper;

            
    public SqlHelper SqlHelper
            
    {
                
    get return sqlHelper; }
                
    set { sqlHelper = value; }
            }


            
    public ShallowCopy()
            
    {

            }


            
    public object Clone()
            
    {
                
    return this.MemberwiseClone();
            }

        }


        
    public class DeepCopy : ICloneable
        
    {
            
    private SqlHelper sqlHelper;

            
    public DeepCopy()
            
    {
            }


            
    public SqlHelper SqlHelper
            
    {
                
    get return sqlHelper; }
                
    set { sqlHelper = value; }
            }


            
    public DeepCopy(SqlHelper sql)
            
    {
                sqlHelper 
    = sql;
            }


            
    public object Clone()
            
    {
                
    return new DeepCopy(new SqlHelper());
            }

        }

    //调用
                Bll.Prototype.ShallowCopy sc = new Bll.Prototype.ShallowCopy();
                sc.SqlHelper 
    = new Bll.Prototype.SqlHelper();
                Bll.Prototype.ShallowCopy sc1 
    = (Bll.Prototype.ShallowCopy)sc.Clone();
                sc1.SqlHelper.Insert();
                sc1.SqlHelper.UpDate();
                
                Bll.Prototype.DeepCopy dc 
    = new Bll.Prototype.DeepCopy();
                dc.SqlHelper 
    = new Bll.Prototype.SqlHelper();
                Bll.Prototype.DeepCopy dc1 
    = (Bll.Prototype.DeepCopy)dc.Clone();
                dc1.SqlHelper.Insert();
                dc1.SqlHelper.UpDate();
  • 相关阅读:
    Ajax学习网址收集
    Crystal Report Download URL and SN
    svn eclipse unable to load default svn client的解决办法
    Effective C++:条款08:别让异常逃离析构函数 (Prevent exceptions from leaving destructors.)
    Effective C++:条款07:为多态基类声明virtual析构函数 (Declare destructors virtual in polymorphic base classes.)
    Effective C++:条款06:若不想使用编译器自动生成的函数,就该明确拒绝 (Explicitly disallow the use of compliergenerated functions you do not want.)
    #define高级教程
    Effective C++:条款04:确定对象被使用前已先被初始化 (Make sure that objects are initialized before they're used.)
    Effective C++:条款05:了解C++默默编写并调用哪些函数 (Know what functions C++ silently writes and calls.)
    Linq 调用存储过程(转)
  • 原文地址:https://www.cnblogs.com/tommyli/p/1060153.html
Copyright © 2011-2022 走看看