原型模式
原型模式是最容易理解的设计模式。
原型模式定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
说直接点,就是创建一个对象的拷贝。
原型模式通用类图:
客户端(上层模块)想要创建一个已有对象(prototype)的副本,这个对象有一个克隆方法,调用这个方法就会返回一个与它一摸一样的对象,上层模块不必要直到具体类型,只需要直到抽象类即可。
原型模式代码实现:
注意,Java最简单的实现方式就是使用Object的clone()方法。如果不了解这个方法,请看我的另一篇博客点击查看:Java对象克隆
abstract class Prototype implements Cloneable{
//...
public Prototype clone() {
Prototype clone = null;
try {
clone = (Prototype) super.clone();
//...抽象类中的字段的深拷贝
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
return clone;
}
}
class ConcretePrototype extends Prototype{
//...
private Date date = new Date();
@Override
public Prototype clone() {
ConcretePrototype clone = null;
clone = (ConcretePrototype) super.clone();
//深拷贝
clone.date = (Date) this.date.clone();
return clone;
}
}
public class Client {
static Prototype prototype = new ConcretePrototype();
public static void main(String[] args) {
Prototype clone = prototype.clone();
}
}
Prototype.clone()用来克隆抽象类中的字段,对于它的子类,如果有新的字段,就要覆写clone()方法。
应用场景以及优点
应用场景
适用于一个对象多个修改者的场景。如果一个对象可能被多个修改者修改,则会有未知的结果,在这样的情况下,修改者修改时,不会直接修改这个对象,而是修改它的副本。
优点
- 性能优良:拷贝一个对象,使用的方式是拷贝二进制流,而不是调用new,相比于new,效率更高。
- 逃避构造方法(函数)的约束:对象克隆时,构造函数不会被执行,也就不会有约束。(这也是原型模式的缺点)
通常,原型模式与工厂方法模式配合使用,工厂方法返回的是一个通过原型模式产生的对象,又回到了前面说过的工厂方法模式,对于上层来说,不需要知道工厂方法是怎样产生对象,其中一种产生方式就是使用对象克隆