概念
原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不需要再次调用构造函数。原型模式可以大大提高创建对象的效率,同时可以避免因为多次创建对象而消耗过多的系统资源。
在原型模式中,通常会定义一个抽象的原型接口,用于规定复制对象的方法。然后,具体的原型类会实现这个接口,并实现复制方法。当需要创建新对象时,只需要使用已有的对象来调用复制方法,就可以创建一个与原对象相同的新对象。
应用场景
①创建对象时,资源的消耗较大,例如读取文件、数据库操作等,可以通过原型模式避免重复的资源消耗。
②创建对象时,构造函数的参数较为复杂,或者构造函数的过程比较耗时,可以通过原型模式来复制一个已有对象,省去重新构造的过程。
③需要创建大量相似的对象时,通过原型模式来创建新对象可以提高效率。
java举例
// 创建一个抽象的原型接口
interface Prototype {
Object clone();
}
// 具体的原型类
class ConcretePrototype implements Prototype {
private String name;
private int age;
public ConcretePrototype(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Object clone() {
return new ConcretePrototype(this.name, this.age);
}
}
// 客户端调用
class Client {
public static void main(String[] args) {
ConcretePrototype prototype = new ConcretePrototype("Jack", 20);
ConcretePrototype clone1 = (ConcretePrototype) prototype.clone();
ConcretePrototype clone2 = (ConcretePrototype) prototype.clone();
System.out.println(clone1 == clone2); // false
}
}
UML类图:
在上述代码中,Prototype是一个抽象的原型接口,定义了一个clone()方法用于复制对象。ConcretePrototype是具体的原型类,实现了Prototype接口,并实现了clone()方法。在客户端调用中,先创建一个ConcretePrototype对象作为原型对象,然后复制这个对象来创建新的对象。在复制的过程中,会调用clone()方法来复制原型对象。
需要注意的是,Java中的Cloneable接口也可以用于实现原型模式。如果要使用Cloneable接口来实现原型模式,需要满足以下两个条件:一是需要实现Cloneable接口,二是需要重写Object类中的clone()方法。
原型模式在java框架当中的应用
①Spring框架中的Prototype作用域
spring框架中的bean有多种作用域,其中之一就是Prototype作用域。当Bean的作用域被配置为Prototype时,在每次注入该Bean时,Spring容器都会创建一个新实例。这种作用域通常用于创建很多有状态的对象,例如HttpSession类。
②MyBatis框架中的ResultMap
MyBatis框架中的ResultMap,是一个在数据库查询结果与Java对象映射方向上的映射描述,其中用的是原型模式。当查询结果集中存在包含关系时,ResultMap可以作为模板,根据模板复制出多个不同的ResultMap。这样做可以大大提高MyBatis的灵活性和可扩展性。
③Hibernate框架中的clone方法
Hibernate框架中的复制操作使用的也是原型模式。Hibernate提供了一个实体类方法clone(),当需要复制实体对象时,可以直接调用该方法来复制对象,而不需要使用BeanUtils等工具类的copy方法。这种原型模式的实现方式,可以较好地避免对象引用关系复制时的问题。