广州品牌建站广州品牌建站,青海做网站最好的公司,网站系统建设与管,怎么发布php网站文章目录 引言原型模式简介定义与用途实现方式UML 使用场景优势与劣势原型模式在spring中的应用员工记录示例代码地址 引言
原型模式是一种创建型设计模式#xff0c;它允许对象能够复制自身#xff0c;以此来创建一个新的对象。这种模式在需要重复地创建相似对象时非常有用… 文章目录 引言原型模式简介定义与用途实现方式UML 使用场景优势与劣势原型模式在spring中的应用员工记录示例代码地址 引言
原型模式是一种创建型设计模式它允许对象能够复制自身以此来创建一个新的对象。这种模式在需要重复地创建相似对象时非常有用可以显著提高性能和代码的可维护性。
原型模式简介
定义与用途
原型模式使得一个对象能够创建自己的副本从而简化对象的创建过程尤其是当创建新实例的成本比较高时。这种模式通常用于情况下
实例化的成本比克隆高。类不容易预测需要创建哪种类的对象。需要避免与产品层次结构耦合的系统。
实现方式
原型模式通常涉及以下几个关键步骤
实现一个原型接口该接口用于定义克隆对象的方法。通过实现原型接口的类创建具体原型。通过克隆方法创建新的对象。
UML 使用场景
当直接创建一个对象的成本比通过克隆来创建该对象的成本高时。当一个系统应该独立于它的产品创建、构成和表示时。当需要实例化的类是在运行时指定时例如通过动态加载。
优势与劣势
优势 提高性能避免了新对象的初始化过程特别是对于复杂或资源密集型对象。 提高灵活性可以在运行时动态地改变具体的类实例。劣势 克隆复杂对象可能也相对复杂。 在实现深拷贝时需要特别小心以确保复制的对象完全独立于原型。
原型模式在spring中的应用
在Spring框架中原型模式的应用体现在它的Bean作用域管理上。虽然Spring的默认行为是以单例模式创建和管理Bean但它也支持原型作用域Prototype Scope
1.Bean的多实例创建
当在Spring配置文件中将Bean的作用域设置为prototype时Spring容器对每个getBean()请求都会创建一个新的Bean实例。
这意味着如果你多次请求同一个BeanSpring会每次都创建一个新的实例而不是返回同一个共享的实例。2.应用场景
当你需要每次使用时都有一个新的对象实例而不是共享实例时原型作用域就非常有用。
例如在应用程序中如果你需要一个非共享的、独立的对象来处理每次的用户请求那么就可以使用原型作用域。3.配置方式
在Spring的XML配置中可以通过设置scopeprototype来指定Bean为原型作用域。
在基于注解的配置中可以使用Scope(prototype)注解来实现同样的效果。员工记录示例
在我们的示例中我们将实现一个名为Prototype的接口它包含一个返回Prototype类型的getClone()方法。这个方法的目的是允许一个对象复制自身从而创建一个新的对象实例。接着我们将创建一个具体的类EmployeeRecord它实现了Prototype接口。EmployeeRecord类的主要功能是克隆自身对象以此方式创建新的EmployeeRecord实例。最后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 薪水 \t\t 地址);}// 带参数的构造函数用于创建员工记录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 方法Overridepublic 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