二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道

本文主要是介绍二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


在软件开发中,我们经常需要创建和复制对象。然而,有时候直接创建对象可能会导致性能下降或代码重复。为了解决这些问题,原型模式应运而生。而使用原型管理器(Prototype Manager)来集中管理原型对象可以进一步提高灵活性和可维护性。本文将详细介绍原型管理器的用途、与其他设计模式的结合实践,并重点讨论处理深克隆和浅克隆的问题。


一、原型管理器的作用与实践


原型管理器是一个中心化的存储库,用于管理和提供原型对象的克隆副本。它能够集中管理多个原型对象,并提供一种简单的方式来获取和复制这些对象。这种集中化的管理方式带来了以下优点:

  • 提高创建对象的效率:通过原型管理器,我们可以在需要时直接克隆原型对象,避免了重复创建对象的开销。
  • 简化对象创建过程:原型管理器将创建对象的过程集中在一处,使得创建逻辑更加清晰,代码更易维护。
  • 促进对象的复用:原型管理器可以在不同的场景中重复使用原型对象,提高了代码的可扩展性和可维护性。

为了更好地理解原型管理器的实践,让我们结合工厂方法模式和单例模式来演示其用法。


1、创建原型接口和具体原型类

首先,我们定义一个原型接口 Prototype,其中包含 clone 方法用于克隆对象。

public interface Prototype extends Cloneable {Prototype clone();
}

然后,我们创建具体的原型类 ConcretePrototype1ConcretePrototype2,它们实现了 Prototype 接口并重写了 clone 方法。

public class ConcretePrototype1 implements Prototype {@Overridepublic Prototype clone() {try {return (ConcretePrototype1) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
}public class ConcretePrototype2 implements Prototype {@Overridepublic Prototype clone() {try {return (ConcretePrototype2) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
}

2、创建原型管理器

接下来,我们创建原型管理器 PrototypeManager,它负责集中管理原型对象并提供克隆副本。

import java.util.HashMap;
import java.util.Map;public class PrototypeManager {private static Map<String, Prototype> prototypes = new HashMap<>();public static void registerPrototype(String key, Prototype prototype) {prototypes.put(key, prototype);}public static Prototype clonePrototype(String key) {Prototype prototype = prototypes.get(key);if (prototype != null) {return prototype.clone();}return null;}
}

在上述代码中,PrototypeManager 使用一个 Map 数据结构来存储原型对象,其中键是对象的标识符,值是原型对象本身。
registerPrototype 方法用于注册原型对象,将其添加到管理器中。
clonePrototype 方法根据指定的键来获取对应的原型对象,并通过克隆方法创建并返回一个克隆副本。


3、使用原型管理器和其他设计模式的实践

原型管理器与其他设计模式的结合使用可以增强系统的灵活性和可扩展性。

下面以工厂方法模式和单例模式为例,演示如何结合这些模式来使用原型管理器。

首先,我们创建一个工厂类 ProductFactory,它使用原型管理器来创建产品对象。

public class ProductFactory {public static Product createProduct(String type) {Prototype prototype = PrototypeManager.clonePrototype(type);if (prototype instanceof Product) {return (Product) prototype;}return null;}
}

在上述代码中,ProductFactory 中的 createProduct 方法根据传入的类型(键),通过原型管理器获取对应的原型对象,并将其转换为产品对象。


接下来,我们创建一个单例类 Application,它使用工厂方法来创建产品对象。

public class Application {private static Application instance = new Application();private Application() {}public static Application getInstance() {return instance;}public void run() {Product product = ProductFactory.createProduct("Type1");if (product != null) {product.doSomething();}}
}

在上述代码中,Application 是一个单例类,通过 getInstance 方法获取唯一的实例。在 run 方法中,我们使用工厂方法创建产品对象,并调用其方法。


二、处理深克隆和浅克隆的问题

在使用原型模式时,我们常常需要考虑克隆对象的属性类型。默认情况下,克隆操作是浅克隆,即只复制基本类型的属性值,而引用类型的属性仍然指向相同的对象。这可能导致在修改克隆对象时,原对象的引用类型属性也会受到影响。


为了解决这个问题,我们可以在具体原型类中进行深克隆的处理。深克隆会复制引用类型属性所指向的对象,从而确保克隆对象和原对象的引用类型属性指向不同的对象。


下面是一个修改后的代码示例,展示了如何处理深克隆和浅克隆的问题:

public class ConcretePrototype1 implements Prototype {private String name;private List<String> list;public ConcretePrototype1(String name, List<String> list) {this.name = name;this.list = list;}// 深克隆@Overridepublic Prototype clone() {try {ConcretePrototype1 clone = (ConcretePrototype1) super.clone();clone.list = new ArrayList<>(list);  // 创建新的列表对象并复制原列表的元素return clone;} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}// 省略其他方法和属性
}

在上述代码中,ConcretePrototype1 类中添加了一个名为 list 的引用类型属性,并在 clone 方法中进行了深克隆。


总结:

原型管理器是一种有助于集中管理对象原型的设计模式,它能够提高对象创建的效率和代码的可维护性。通过与其他设计模式的结合实践,如工厂方法模式和单例模式,我们可以进一步增强系统的灵活性和可扩展性。


同时,在处理深克隆和浅克隆的问题时,我们需要根据具体需求选择合适的克隆方式,并在具体原型类中进行相应的处理。深克隆和浅克隆的选择将影响对象属性的独立性和引用对象的共享性。


通过本文的介绍,相信你对原型管理器的概念和使用有了更深入的了解。在实际开发中,原型管理器可以帮助我们更好地管理对象原型,并提高代码的效率和可维护性。


然而,设计模式世界中还有许多其他精彩的故事等待我们探索。在下一篇博文中,我们将深入研究另一个引人入胜的设计模式,为你带来更多惊喜。敬请期待!


好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。


这篇关于二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/302471

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库