原型模式

原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象;

模式类型:创建者模式

一般实现

abstract class Prototype
{
     public abstract Prototype clone();
}

class ConcretePrototype:Prototype
{
     private int str;
     public intStr
      {
           get{return str;}
           set{str=value;} 
      }
//克隆方法
      public override Prototype clone()
       {
          ConcretePrototype protype=new ConcretePrototype();
          protype.Str=str;
          return protype;
        }  
}

 以上为一般手写实现方法;

而根据在复制原型对象的同时是否对引用类型进行复制,又把克隆分为浅克隆和深克隆.

通过以上手写的克隆方法,如果想实现深克隆,需要声明一个新的引用类型变量;

c#中的字符串对象存在特殊性,只要两个字符串的内容相同,无论直接赋值还是创建新对象,他们在内存中始终只有一份

 

c#提供了一个MemberwiseClone()方法用于实现浅克隆;

class Member
{

}
View Code
class ConcretePrototype
{
     private Member member;
     public Member Member
      {
           get{return member;}
           set{Member=value;} 
      }
//克隆方法
      public ConcretePrototype clone()
       {
          return (ConcretePrototype)this.MemberwiseClone();
        }  
}
View Code

c#还提供了一个ICloneable借口,它也可以用来创建当前对象的副本,充当了抽象原型类的角色,具体原型类通常作为实现该接口的子类

class Member{}
    class ConcretePrototype : ICloneable//实现ICloneable接口
    {
        private int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private Member member;

        internal Member Member
        {
            get { return member; }
            set { member = value; }
        }
//实现深克隆
        public object Clone()
        {
            ConcretePrototype copy = (ConcretePrototype)this.MemberwiseClone();
            Member newMember = new Member();
            copy.member = newMember;
            return copy;
        }
       
        
    }
View Code

感觉原型模式的使用环境为:一个对象需要多次创建,并且这个对象的成员较为复杂,这样的话通过克隆一个已有对象就可以较快的创建一个新的对象

除了通过直接创建新的成员对象来手工实现深克隆外,还可以通过反射,序列化等方法来实现深克隆,待续吧

posted @ 2014-04-04 18:43  搞IT的蟋蟀  阅读(169)  评论(0)    收藏  举报