1、原型模式的学习
当我们需要创建一个对象,并且该对象的创建过程比较复杂或者耗时时,可以使用原型模式。原型模式通过复制现有对象的属性来创建新的对象,而不是从头开始创建。
在原型模式中,我们定义一个原型接口或抽象类,该接口或抽象类定义了克隆方法。具体的原型类实现克隆方法,并根据自身的属性创建新的对象。
通过使用原型模式,我们可以避免重复创建对象的开销,提高创建对象的效率。它还使得对象的创建更加灵活,因为我们可以根据需要克隆现有对象,而无需依赖于具体的类和构造函数。
以下是原型模式的一些关键要点:
- 原型接口或抽象类:定义克隆方法,用于创建新对象的副本。
- 具体的原型类:实现原型接口或抽象类,并根据自身的属性进行克隆。
- 客户端:使用原型对象创建新的对象,而无需关心具体的实现细节。
2、原型模式的使用
假设你正在开发一个游戏,其中有一种怪物叫做"巨型哥布林"。每个巨型哥布林都有自己的属性(如血量、攻击力等)和外观(如模型、颜色等)。你需要设计一个原型模式来创建巨型哥布林对象,并能够快速复制多个相同属性的怪物。
具体的原型类
@Data
public class BigGoblin implements Cloneable {
protected Integer blood;
protected Integer offensive;
protected String model;
protected String colour;
public BigGoblin(Integer blood, Integer offensive, String model, String colour) {
this.blood = blood;
this.offensive = offensive;
this.model = model;
this.colour = colour;
}
@Override
protected BigGoblin clone() {
try {
return (BigGoblin) super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
}
客户端
public class protoTypeClient {
public static void main(String[] args) {
BigGoblin goblin = new BigGoblin(100, 50, "丑陋", "green");
BigGoblin bigGoblin = goblin.clone();
bigGoblin.setColour("yellow");
System.out.println(JSON.toJSONString(goblin));
System.out.println(JSON.toJSONString(bigGoblin));
}
}
{"blood":100,"colour":"green","model":"丑陋","offensive":50}
{"blood":100,"colour":"yellow","model":"丑陋","offensive":50}
3、总结
原型模式的优点包括:
- 减少对象的创建成本,避免了重复的初始化操作。
- 可以更灵活地创建对象,通过克隆现有对象来创建新对象,而无需依赖具体的类和构造函数。
- 提高了性能,特别是在创建对象成本较高的情况下。
需要注意以下几点: - 克隆方法需要注意深拷贝(深拷贝需要在clone方法中新创建对象)和浅拷贝的问题,确保克隆对象的属性不会相互影响。
- 原型模式适用于对象的创建过程相对复杂、耗时的情况下,如果对象的创建过程比较简单,直接使用new关键字创建即可。