`

原型模式

    博客分类:
  • C++
阅读更多
Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
因为Java中的提供clone()方法来实现对象的克隆(具体了解clone()按这里),所以Prototype模式实现一下子变得很简单.

以勺子为例:
Java代码
public abstract class AbstractSpoon implements Cloneable  
{   
  String spoonName;   
 
  public void setSpoonName(String spoonName) {this.spoonName = spoonName;}  
  public String getSpoonName() {return this.spoonName;}  
 
  public Object clone()   
  {  
    Object object = null;  
    try {  
      object = super.clone();  
    } catch (CloneNotSupportedException exception) {  
      System.err.println("AbstractSpoon is not Cloneable");  
    }  
    return object;  
  }  



有两个具体实现(ConcretePrototype):

Java代码
public class SoupSpoon extends AbstractSpoon
{
  public SoupSpoon()
  {
    setSpoonName("Soup Spoon");
  }
}

Java代码
public class SaladSpoon extends AbstractSpoon
{
  public SaladSpoon()
  {
    setSpoonName("Salad Spoon");
  }
}


调用Prototype模式很简单:

Java代码
AbstractSpoon spoon = new SoupSpoon();  
AbstractSpoon spoon = new SaladSpoon();




克隆的实现方法有两种:浅拷贝(shallow copy)与深拷贝(deep copy)。

浅拷贝是指当对象的字段值被拷贝时,字段引用的对象不会被拷贝。例如,如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅拷贝,那么两个对象将引用同一个字符串。

深拷贝是对对象实例中字段引用的对象也进行拷贝的一种方式,所以如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个深拷贝的话,我们将创建一个新的对象和一个新的字符串--新对象将引用新字符串。需要注意的是执行深拷贝后,原来的对象和新创建的对象不会共享任何东西;改变一个对象对另外一个对象没有任何影响。

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

  • 大小: 6.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics