原型模式定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:
通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
原型模式有两种实现方法:
一种是简单的创建模式。一种是登记式的。
同时Java中的提供clone()方法来实现对象的克隆,
第一种:这里截取一张图
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;
}
}
下面定义一个具体的实现
public class SoupSpoon extends AbstractSpoon
{
public SoupSpoon()
{
setSpoonName("Soup Spoon");
}
}
这里的调用方法是
AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = spoon.clone();
第二中:登记式的,这里截取一张图
这里比上面就多了一个PrototypeManager,这里没有写里面的实例变量
public class SpoonManager {
/**
* 用来记录原型的编号和原型实例的对应关系
*/
private static Map<String,Prototype> map = new HashMap<String,Prototype>();
private SpoonManager(){}
public synchronized static void setPrototype(String prototypeId , Prototype prototype){
map.put(prototypeId, prototype);
}
public synchronized static void removePrototype(String prototypeId){
map.remove(prototypeId);
}
public synchronized static Prototype getPrototype(String prototypeId) throws Exception{
Prototype prototype = map.get(prototypeId);
if(prototype == null){
throw new Exception("您希望获取的原型还没有注册或已被销毁");
}
return prototype;
}
}
这里的调用方法就是
AbstractSpoon spoon1 = new SoupSpoon();
SpoonManager.setPrototype("1", spoon1);
//获取原型来创建对象
AbstractSpoon spoon2 = SpoonManager.getPrototype("1").clone();
这样就有了spoon2是由spoon1 克隆而来,同时这样的方法的一个好处是
你将创建过的对象都保存在一个map中,所以不需要你自己去记住有哪些引用,这样的话之后你每一个想得到一个对象,你可以先去map中找有没有已经登记在map中的,有的话直接使用,没有的情况再去创建。这样当想创建的对象很多的时候会很有用。