创建模式之—原型模式
我的版本:
原型模式:
概念:用原型指点创建对象的种类,并且通过拷贝这些原型创建新的对象
目的:允许一个对象再创建另外一个可定制的对象,根本不需要知道任何如何创建的细节
要求:实现cloneable
图像:
/*** Class** @author ANDY** 2012-9 -3 上午11:20:21** 克隆接口继承 Cloneable接口*/public interface Prototype extends Cloneable {/*** Methods** 吃东西的方法*/public void eat();/*** Methods** @return 本身* 克隆自己*/public Prototype clone();}/*** Class** @author ANDY** 2012 -9- 3 上午11:25:27** 人实现Prototype接口*/public class Person implements Prototype {/*** 人的名称*/private String name ;/*** Methods** @return* 得到名字*/public String getName() {return name ;}/*** Methods** @param name* 设置名字*/public void setName(String name) {this.name = name;}/** (non- Javadoc)** @see prototype_原型模式.Prototype#eat()** 吃东西实现方法*/@Overridepublic void eat() {System. out.println("吃东西" );}/** (non- Javadoc)** @see java.lang.Object#clone()** 克隆自己实现方法*/@Overridepublic Prototype clone() {try {return (Prototype) super.clone();} catch (CloneNotSupportedException e) {return null ;}}}/*** Class** @author ANDY** 2012 -9- 3 上午11:26:59** 客户类可以直接克隆Person*/public class Client {/*** Methods** @param pe* @return* 克隆的方法*/public Prototype clone(Prototype pe) {return pe.clone();}/*** Methods** @param args* 测试方法*/public static void main(String[] args) {Client client = new Client();Person p0 = new Person();p0.setName( "andy");Person p1 = (Person)client.clone(p0);Person p2 = (Person)client.clone(p0);System. out.println(p1.getName());System. out.println(p2.getName());p1.eat();System. out.println(p1==p2);System. out.println(p0==p2);}}
原型模式定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
如何使用?
因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单.
以勺子为例:
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):
public class SoupSpoon extends AbstractSpoon
{
public SoupSpoon()
{
setSpoonName("Soup Spoon");
}
}
调用Prototype模式很简单:
AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = spoon.clone();
当然也可以结合工厂模式来创建AbstractSpoon实例。
在Java中Prototype模式变成clone()方法的使用,由于Java的纯洁的面向对象特性,使得在Java中使用设计模式变得很自然,两者已经几乎是浑然一体了。这反映在很多模式上,如Interator遍历模式。