设计模式之原型模式

原型模式是一种创建型设计模式,通过复制已有对象创建新对象,提高效率并避免资源消耗。Java中可通过实现Cloneable接口和重写clone()方法实现。文章提到了Spring框架的Prototype作用域、MyBatis的ResultMap以及Hibernate的clone方法如何运用原型模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不需要再次调用构造函数。原型模式可以大大提高创建对象的效率,同时可以避免因为多次创建对象而消耗过多的系统资源。

在原型模式中,通常会定义一个抽象的原型接口,用于规定复制对象的方法。然后,具体的原型类会实现这个接口,并实现复制方法。当需要创建新对象时,只需要使用已有的对象来调用复制方法,就可以创建一个与原对象相同的新对象。

应用场景

①创建对象时,资源的消耗较大,例如读取文件、数据库操作等,可以通过原型模式避免重复的资源消耗。

②创建对象时,构造函数的参数较为复杂,或者构造函数的过程比较耗时,可以通过原型模式来复制一个已有对象,省去重新构造的过程。

③需要创建大量相似的对象时,通过原型模式来创建新对象可以提高效率。

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类图:
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方法。这种原型模式的实现方式,可以较好地避免对象引用关系复制时的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代号diitich

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值