原型

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();
posted @ 2008-01-31 16:39  李占卫  阅读(238)  评论(1编辑  收藏  举报