搜索
首页Javajava教程在 Spring Boot 中实现原型设计模式

介绍

在应用程序开发中,管理对象创建可能很复杂,特别是在处理几乎相同但具体细节有所不同的实例时。原型设计模式提供了一种解决方案,允许我们通过复制或“克隆”现有对象来创建新对象。当对象的创建成本高昂或涉及大量初始化时,此模式特别有用。

在本文中,我们将使用实际的电子商务用例来探索如何在 Spring Boot 应用程序中实现原型设计模式:创建和保留产品变体。通过这个示例,您不仅可以了解原型模式的基础知识,还可以了解它如何简化实际应用程序中的对象创建。

了解原型设计模式

原型模式是一种创建型设计模式,允许您通过克隆现有对象(称为原型)来创建新实例。当您拥有具有各种属性的基础对象时,这种方法特别有用,并且从头开始创建每个变体将是多余且低效的。

在 Java 中,这种模式通常使用 Cloneable 接口或定义自定义克隆方法来实现。主要思想是提供一个可以通过修改进行复制的“蓝图”,保持原始对象完整。

原型模式的主要优点:

  1. 减少初始化时间:您无需从头开始创建对象,而是克隆和修改现有实例,从而节省初始化时间。

  2. 封装对象创建逻辑:您可以定义如何在对象本身内克隆对象,同时隐藏实例化详细信息。

  3. 增强性能:对于经常创建类似对象(例如产品变体)的应用程序,原型模式可以提高性能。

电子商务用例:管理产品变体

想象一个电子商务平台,其中基本产品具有各种配置或“变体” - 例如,具有不同颜色、存储选项和保修条款的智能手机。我们可以克隆基础产品,然后根据需要调整特定字段,而不是从头开始重新创建每个变体。这样,共享属性保持一致,我们只修改特定于变体的细节。

在我们的示例中,我们将构建一个简单的 Spring Boot 服务,以使用原型模式创建和保存产品变体。

在 Spring Boot 中实现原型模式

第 1 步:定义基础产品

首先定义一个产品类,其中包含产品的必要字段,例如 ID、名称、颜色、型号、存储、保修和价格。我们还将添加一个 cloneProduct 方法来创建产品的副本。

public interface ProductPrototype extends Cloneable {
    ProductPrototype cloneProduct();
}
@Entity
@Table(name = "products")
@Data
public class Product implements ProductPrototype {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "product_id")
    private Long productId;

    @Column(name = "name")
    private String name;

    @Column(name = "model")
    private String model;

    @Column(name = "color")
    private String color;

    @Column(name = "storage")
    private int storage;

    @Column(name = "warranty")
    private int warranty;

    @Column(name = "price")
    private double price;

    @Override
    public ProductPrototype cloneProduct() {
        try {
            Product product = (Product) super.clone();
            product.setId(null); // database will assign new Id for each cloned instance
            return product;
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}

在此设置中:

cloneProduct: 此方法创建 Product 对象的克隆,并将 ID 设置为 null 以确保数据库为每个克隆实例分配一个新 ID。

第 2 步:创建处理变体的服务

接下来,创建一个具有保存变体方法的 ProductService。此方法克隆基础产品并应用特定于变体的属性,然后将其另存为新产品。

public interface ProductService {

    // For saving the base product
    Product saveBaseProduct(Product product);

    // For saving the variants
    Product saveVariant(Long baseProductId, VariantRequest variant);
}
@Log4j2
@Service
public class ProductServiceImpl implements ProductService {

    private final ProductRepository productRepository;

    public ProductServiceImpl(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    /**
     * Saving Base product, Going to use this object for cloning
     *
     * @param product the input
     * @return Product Object
     */
    @Override
    public Product saveBaseProduct(Product product) {
        log.debug("Save base product with the detail {}", product);
        return productRepository.save(product);
    }

    /**
     * Fetching the base product and cloning it to add the variant informations
     *
     * @param baseProductId baseProductId
     * @param variant       The input request
     * @return Product
     */
    @Override
    public Product saveVariant(Long baseProductId, VariantRequest variant) {
        log.debug("Save variant for the base product {}", baseProductId);
        Product baseProduct = productRepository.findByProductId(baseProductId)
                .orElseThrow(() -> new NoSuchElementException("Base product not found!"));

        // Cloning the baseProduct and adding the variant details
        Product variantDetail = (Product) baseProduct.cloneProduct();
        variantDetail.setColor(variant.color());
        variantDetail.setModel(variant.model());
        variantDetail.setWarranty(variant.warranty());
        variantDetail.setPrice(variant.price());
        variantDetail.setStorage(variant.storage());

        // Save the variant details
        return productRepository.save(variantDetail);
    }
}

在此服务中:

saveVariant:此方法通过 ID 检索基本产品,克隆它,应用变体的详细信息,并将其保存为数据库中的新条目。

第 3 步:创建变体的控制器

创建一个简单的 REST 控制器来公开变体创建 API。

@RestController
@RequestMapping("/api/v1/products")
@Log4j2
public class ProductController {

    private final ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @PostMapping
    public ResponseEntity<product> saveBaseProduct(@RequestBody Product product) {
        log.debug("Rest request to save the base product {}", product);
        return ResponseEntity.ok(productService.saveBaseProduct(product));
    }

    @PostMapping("/{baseProductId}/variants")
    public ResponseEntity<product> saveVariants(@PathVariable Long baseProductId, @RequestBody VariantRequest variantRequest) {
        log.debug("Rest request to create the variant for the base product");
        return ResponseEntity.ok(productService.saveVariant(baseProductId, variantRequest));
    }
}
</product></product>

这里:

saveVariant: 此端点处理 HTTP POST 请求以创建指定产品的变体。它将创建逻辑委托给 ProductService。

使用原型模式的好处

通过此实施,我们看到了几个明显的优势:

代码可重用性:通过将克隆逻辑封装在 Product 类中,我们避免了服务和控制器层中的代码重复。

简化维护:原型模式集中了克隆逻辑,可以更轻松地管理对象结构的更改。

高效变体创建:每个新变体都是基础产品的克隆,减少冗余数据输入并确保共享属性的一致性。

运行程序

使用 Gradle 构建 Spring Boot 项目

./gradlew build
./gradlew bootRun

通过Rest客户端执行

保存基础产品

curl --location 'http://localhost:8080/api/v1/products' \
--header 'Content-Type: application/json' \
--data '{
    "productId": 101,
    "name": "Apple Iphone 16",
    "model": "Iphone 16",
    "color": "black",
    "storage": 128,
    "warranty": 1,
    "price": 12.5
}'

保存变体

curl --location 'http://localhost:8080/api/v1/products/101/variants' \
--header 'Content-Type: application/json' \
--data '{
    "model": "Iphone 16",
    "color": "dark night",
    "storage": 256,
    "warranty": 1,
    "price": 14.5
}'

结果(新变体仍然存在,没有任何问题)

Implementing the Prototype Design Pattern in Spring Boot

GitHub 存储库

您可以在以下 GitHub 存储库中找到产品变体的原型设计模式的完整实现:​​

GitHub 存储库链接

在 LinkedIn 上关注我

保持联系并关注我,获取有关软件开发、设计模式和 Spring Boot 的更多文章、教程和见解:

在 LinkedIn 上关注我

结论

原型设计模式是一个强大的工具,适用于对象重复频繁的情况,如电子商务应用程序中的产品变体。通过在 Spring Boot 应用程序中实现此模式,我们提高了对象创建的效率和代码的可维护性。这种方法在需要创建具有较小变化的相似对象的场景中特别有用,使其成为现实应用程序开发的一种有价值的技术。

以上是在 Spring Boot 中实现原型设计模式的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Java平台独立性:OS之间的差异Java平台独立性:OS之间的差异May 16, 2025 am 12:18 AM

Java在不同操作系统上的表现存在细微差异。1)JVM实现不同,如HotSpot、OpenJDK,影响性能和垃圾回收。2)文件系统结构和路径分隔符不同,需使用Java标准库处理。3)网络协议实现差异影响网络性能。4)GUI组件外观和行为在不同系统上有别。通过使用标准库和虚拟机测试,可减少这些差异的影响,确保Java程序稳定运行。

Java的最佳功能:从面向对象的编程到安全性Java的最佳功能:从面向对象的编程到安全性May 16, 2025 am 12:15 AM

javaoffersrobustobject-IentiendedProgrammming(OOP)和Top-Notchsecurityfeatures.1)OopinjavainCludesClasses,对象,继承,多态性,和列出,andeclingfleximaintainablesys.ss.2)SecurityFeateTuersLudEtersludEterMachine(

JavaScript与Java的最佳功能JavaScript与Java的最佳功能May 16, 2025 am 12:13 AM

JavaScriptandJavahavedistinctstrengths:JavaScriptexcelsindynamictypingandasynchronousprogramming,whileJavaisrobustwithstrongOOPandtyping.1)JavaScript'sdynamicnatureallowsforrapiddevelopmentandprototyping,withasync/awaitfornon-blockingI/O.2)Java'sOOPf

Java平台独立性:收益,限制和实施Java平台独立性:收益,限制和实施May 16, 2025 am 12:12 AM

JAVAACHIEVESPLATFORMINDEPENTENCETHROUGHJAVAVIRTAILMACHINE(JVM)和BYTECODE.1)THEJVMINTERPRETSBBYTECODE,允许theingthesmecodetorunonanyanyanyanyplatformwithajvm.2)

Java:真实词的平台独立性Java:真实词的平台独立性May 16, 2025 am 12:07 AM

Java'splatFormIndependecemeanSapplicationsCanrunonAnyPlatFormWithAjvm,使“ Writeonce,RunanyWhere”。

JVM性能与其他语言JVM性能与其他语言May 14, 2025 am 12:16 AM

JVM'SperformanceIsCompetitiveWithOtherRuntimes,operingabalanceOfspeed,安全性和生产性。1)JVMUSESJITCOMPILATIONFORDYNAMICOPTIMIZAIZATIONS.2)c提供NativePernativePerformanceButlanceButlactsjvm'ssafetyFeatures.3)

Java平台独立性:使用示例Java平台独立性:使用示例May 14, 2025 am 12:14 AM

JavaachievesPlatFormIndependencEthroughTheJavavIrtualMachine(JVM),允许CodeTorunonAnyPlatFormWithAjvm.1)codeisscompiledIntobytecode,notmachine-specificodificcode.2)bytecodeisisteredbytheybytheybytheybythejvm,enablingcross-platerssectectectectectross-eenablingcrossectectectectectection.2)

JVM架构:深入研究Java虚拟机JVM架构:深入研究Java虚拟机May 14, 2025 am 12:12 AM

TheJVMisanabstractcomputingmachinecrucialforrunningJavaprogramsduetoitsplatform-independentarchitecture.Itincludes:1)ClassLoaderforloadingclasses,2)RuntimeDataAreafordatastorage,3)ExecutionEnginewithInterpreter,JITCompiler,andGarbageCollectorforbytec

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

北端:融合系统,解释
1 个月前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
4 周前By尊渡假赌尊渡假赌尊渡假赌
<🎜>掩盖:探险33-如何获得完美的色度催化剂
2 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。