一、概念
通过复制生成实例
二、代码
定义一个原型接口,实现Cloneable
public interface Prototype extends Cloneable{
/**
* 创建克隆对象
* @return 具体原型实例
*/
Prototype createClone();
}
实现原型接口的具体的原型类,实现createClone方法,使用Object的clone方法克隆生成实例
public class ConcretePrototype implements Prototype{
//记录一下模型名称
private String mould;
public ConcretePrototype(String mould) {
this.mould = mould;
}
@Override
public Prototype createClone() {
Prototype prototype = null;
try {
prototype = (Prototype) this.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("ConcretePrototype{");
sb.append("mould='").append(mould).append('\'');
sb.append('}');
sb.append(" "+super.toString());
return sb.toString();
}
}
定义一个原型管理类PrototypeManeger,维护原型实例
public class PrototypeManager {
//维护原型实例
private static Map<String,Prototype> prototypeCase = new HashMap<>();
public void register(String name, Prototype proto) {
prototypeCase.put(name, proto);
}
public Prototype create(String protoName) {
Prototype proto = prototypeCase.get(protoName);
return proto.createClone();
}
}
main方法使用
public static void main(String[] args) {
//创建一个原型管理
PrototypeManager prototypeManager = new PrototypeManager();
//生成并维护firstCase与lastCase两个原型
prototypeManager.register("firstCase",new ConcretePrototype("firstCase"));
prototypeManager.register("lastCase",new ConcretePrototype("lastCase"));
//通过原型管理创建实例
Prototype firstCase = prototypeManager.create("firstCase");
System.out.println(firstCase);
Prototype lastCase1 = prototypeManager.create("lastCase");
System.out.println(lastCase1);
Prototype lastCase2 = prototypeManager.create("lastCase");
System.out.println(lastCase2);
}
结果
ConcretePrototype{mould='firstCase'} designpattern.prototype_pattern.ConcretePrototype@60e53b93
ConcretePrototype{mould='lastCase'} designpattern.prototype_pattern.ConcretePrototype@5e2de80c
ConcretePrototype{mould='lastCase'} designpattern.prototype_pattern.ConcretePrototype@1d44bcfa
三、类结构
核心类为Prototype,继承了Cloneable,使得其实现类具有了拷贝能力

四、用途
1. 对象的种类比较多的时候,比如打游戏时,不同区域或副本的怪物等级血量不一样,副本又很多,那就每个副本的小怪都维护一个原型,怪物生成就直接基于该原型进行克隆
2. 对象的生成过程比较复杂,使用原型模式,只需要执行一次改复杂的过程生成原型,然后之后生成对象都基于该原型进行克隆
3. 解耦对象管理与对象生成, PrototypeManager与Prototype具有通用性,可与ConcretePrototype进行解耦。
五、其他说明
1. Cloneable是个标记接口,内部没有方法,clone()方法时Object类提供的,再使用clone方法时,如果类没有实现Cloneable(标记),则会抛出CloneNotSupportedException。
public interface Cloneable {
}
2. Object的clone方法是分配一个与被复制对象一样大小的内存空间,将被复制对象的字段值复制到所分配的空间。
3. Object的clone是一个浅拷贝,只是复制了字段值,例如字段是一个List,那么复制的是指该List的引用,也就是被复制的对象与新生成的对象的该字段是同一个List,该情况需要自己实现clone方法。