本文介绍: 这篇教程不仅提供了原型模式的理论基础,还通过具体的Java代码示例展示了如何实现应用这种模式简单理解,通俗易懂

引言

原型模式是一种创建设计模式,它允许对象能够复制自身,以此来创建一个新的对象。这种模式需要重复地创建相似对象时非常有用,可以显著提高性能和代码的可维护性。

原型模式简介

定义与用途

原型模式使得一个对象能够创建自己的副本,从而简化对象的创建过程,尤其是当创建实例的成本比较高时。这种模式通常用于情况下:

实现方式

原型模式通常涉及以下几个关键步骤

UML

在这里插入图片描述

使用场景

  • 当直接创建一个对象的成本比通过克隆来创建该对象的成本高时。
  • 当一个系统应该独立于它的产品创建、构成和表示时。
  • 当需要实例化的类是在运行时指定时,例如,通过动态加载

优势与劣势

原型模式在spring中的应用

在Spring框架中,原型模式的应用体现在它的Bean作用域管理上。虽然Spring的默认行为是以单例模式创建和管理Bean,但它也支持原型作用域(Prototype Scope)

1.Bean的多实例创建:
当在Spring配置文件中将Bean的作用域设置prototype时,Spring容器每个getBean()请求都会创建一个新的Bean实例。
这意味着如果你多次请求同一个Bean,Spring会每次都创建一个新的实例,而不是返回同一个共享实例。

2.应用场景:
当你需要每次使用时都有一个新的对象实例,而不是共享实例时,原型作用域就非常有用。
例如,在应用程序中,如果你需要一个非共享的、独立的对象来处理每次的用户请求,那么就可以使用原型作用域。

3.配置方式:
在Spring的XML配置中,可以通过设置scope="prototype"来指定Bean为原型作用域。
在基于注解配置中,可以使用@Scope("prototype")注解实现同样的效果

员工记录示例

  1. 我们的示例中,我们实现一个名为Prototype的接口,它包含一个返回Prototype类型getClone()方法。这个方法的目的是允许一个对象复制自身,从而创建一个新的对象实例。
  2. 接着,我们将创建一个具体的类EmployeeRecord,它实现了Prototype接口。EmployeeRecord类的主要功能是克隆自身对象,以此方式创建新的EmployeeRecord实例。
  3. 最后,PrototypeDemo类将使用这个具体的EmployeeRecord类来演示原型模式的实际应用。通过PrototypeDemo类,我们可以看到如何使用EmployeeRecord的克隆方法来创建新的员工记录,而无需每次都从头开始创建对象

这个过程非常适用于需要大量相似对象的场景,例如在数据库或任何需要大量相似记录的应用中。使用原型模式,我们可以有效地克隆已有的对象,而不是每次都进行完整的创建过程,从而节省资源时间

Prototype

public interface Prototype {
    //获取当前对象的克隆
    public Prototype getClone();

}

EmployeeRecord

public class EmployeeRecord implements Prototype {

    private int id;
    private String name, designation;
    private double salary;
    private String address;

    public EmployeeRecord() {
        System.out.println("   Oracle公司的员工记录");
        System.out.println("---------------------------------------------");
        System.out.println("员工ID" + "t" + "姓名" + "t" + "职位" + "t" + "薪水" + "tt" + "地址");
    }

    // 带参数构造函数,用于创建员工记录
    public EmployeeRecord(int id, String name, String designation, double salary, String address) {

        this();
        this.id = id;
        this.name = name;
        this.designation = designation;
        this.salary = salary;
        this.address = address;
    }

    // 显示员工记录
    public void showRecord() {
        System.out.println(id + "t" + name + "t" + designation + "t" + salary + "t" + address);
    }

    // 实现 Prototype 接口的 getClone 方法
    @Override
    public Prototype getClone() {
        return new EmployeeRecord(id, name, designation, salary, address);
    }

}

PrototypeDemo

public class PrototypeDemo {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("输入员工ID: ");
        int eid = Integer.parseInt(br.readLine());
        System.out.print("n");

        System.out.print("输入员工姓名: ");
        String ename = br.readLine();
        System.out.print("n");

        System.out.print("输入员工职位: ");
        String edesignation = br.readLine();
        System.out.print("n");

        System.out.print("输入员工地址: ");
        String eaddress = br.readLine();
        System.out.print("n");

        System.out.print("输入员工薪水: ");
        double esalary = Double.parseDouble(br.readLine());
        System.out.print("n");

        // 创建原始员工记录并显示
        EmployeeRecord e1 = new EmployeeRecord(eid, ename, edesignation, esalary, eaddress);
        e1.showRecord();
        System.out.println("n");

        // 克隆员工记录并显示
        EmployeeRecord e2 = (EmployeeRecord) e1.getClone();
        e2.showRecord();
    }

}

以上就是一个简单的原型模式示例,来演示如何创建原始对象的副本。这种方式对于创建多个相似对象时非常有用,既节省了创建新对象的时间,又减少了代码复杂性。
运行代码:
在这里插入图片描述

代码地址

23种设计模式相关代码后续会逐步提交github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

原文地址:https://blog.csdn.net/qq_33129875/article/details/134667952

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_5119.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注