类关系图


类角色说明
客户(Client)角色:客户类提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个 C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了 ICloneable接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。

意图
通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。

适用性
·当要实例化的类是在运行时刻指定时,例如,通过动态装载;
·或者为了避免创建一个与产品类层次平行的工厂类层次时;
·或者当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

泡妞的例子
PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)? 

泡妞的代码

using System;
using System.Collections;

//"Prototype"抽象原型
public abstract class 情话原型
{
    
public abstract 情话原型 Clone();
}


// "ConcretePrototype"具体原型
public class 情话:情话原型
{
    
private string word;
    
public 情话()
    
{
    }

    
    
public string Word
    
{
        
get{return word;}
        
set{word=value;}
    }

    
//浅拷贝而已
    public override 情话原型 Clone()
    
{
        
return (情话原型)this.MemberwiseClone();
    }

    
public void Display()
    
{
        Console.WriteLine(word);
    }

}


// Prototype manager    原型管理器
public class 情话集合
{
    Hashtable 情话盒子 
= new Hashtable();
    
    
public 情话原型 thisstring key ]
    
{
      
getreturn (情话原型)情话盒子[ key ]; }
      
set{ 情话盒子.Add( key, value ); }
   }

}

public class Client
{
    
public static void Main()
    
{
        情话集合 集合
=new 情话集合();
        情话 a
=new 情话();
        a.Word
="如果我不向你求婚,我会后悔一辈子,因为你是我的惟一。";
        集合[
"最易动心的情话"]=a;
        a
=new 情话();
        a.Word
="我将把你紧紧地搂在怀中,吻你亿万次,像在赤道上面那样炽烈的吻。";
        集合[
"最狂热的情话"]=a;
        a
=new 情话();
        a.Word
="有桩事你也许没注意,你给我的那把牙刷成了我的恩物,每一次使用都得到极大的满足,我要永远使用它,除非你再给我一把。";
        集合[
"最实用的情话"]=a;
        
        情话 b
=(情话)集合["最狂热的情话"].Clone();
        b.Display();
        b
=(情话)集合["最易动心的情话"].Clone();
        b.Display();
        
        
//注意这里:clone取出集合中的该对象的一个完整的副本,该副本和集合中的对象享有不同的内存空间
        b=(情话)集合["最实用的情话"].Clone();
        b.Display();
        
//当改变b的值的时候,并不对结合中的原对象造成影响
        b.Word="我在忧愁时想你,就像在冬季想太阳;我在快乐时想你,就像在骄阳下想树荫。";
        b.Display();
        ((情话)集合[
"最实用的情话"]).Display();
        
//当改变集合中原型的值时候,也不对副本造成影响
        ((情话)集合["最实用的情话"]).Word="我在快乐时想你,就像在骄阳下想树荫。我在忧愁时想你,就像在冬季想太阳;";
        ((情话)集合[
"最实用的情话"]).Display();
        b.Display();
    }

}

原始模型模式
原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

优缺点
1、Prototype模式允许动态增加或减少产品类。由于创建产品类实例的方法是产批类内部具有的,因此增加新产品对整个结构没有影响。
2、Prototype模式提供了简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,而Prototype模式就不需要这样。
3、Portotype模式具有给一个应用软件动态加载新功能的能力。由于 Prototype的独立性较高,可以很容易动态加载新功能而不影响老系统。
4、产品类不需要非得有任何事先确定的等级结构,因为 Prototype模式适用于任何的等级结构。
Prototype模式的最主要缺点就是每一个类必须配备一个克隆方法。而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事。
 

说明
在C#里面,我们可以很容易的通过Clone()方法实现原型模式。任何类,只要想支持克隆,必须实现C#中的ICloneable接口。ICloneable接口中有一Clone方法,可以在类中复写实现自定义的克隆方法。克隆的实现方法有两种:浅拷贝(shallow copy)与深拷贝(deep copy)。浅拷贝是指当你拷贝的对象的属性引用某个对象的时候,只是拷贝这个属性字段的引用,而不拷贝引用的对象。而深拷贝是对对象实例中字段引用的对象也进行拷贝的一种方式。需要注意的是执行深拷贝后,原来的对象和新创建的对象不会共享任何东西;改变一个对象对另外一个对象没有任何影响。MemberwiseClone()方法是Object类的一个受保护方法,实现了对象的浅拷贝。如果希望实现一个深拷贝,应该实现ICloneable接口,并自己编写ICloneable的Clone接口方法。
posted on 2007-02-02 22:57  十分之七  阅读(292)  评论(0)    收藏  举报