Java享元设计模式优化对象创建提高性能和效率

 更新时间:2023年04月22日 09:06:21   作者:.番茄炒蛋  
Java享元设计模式通过共享可重用的对象,减少了系统中对象的数量,优化了对象的创建和管理,提高了性能和效率。它是一种经典的设计模式,适用于需要处理大量相似对象的应用程序

介绍

Java中的享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享尽可能多的对象来减少内存占用和提高性能.

Java享元模式通常包含以下4种角色

  • 享元工厂(Flyweight Factory):负责创建和管理享元对象.
  • 具体享元(Concrete Flyweight):实现享元接口并存储与共享状态相关的内部状态.
  • 抽象享元(Flyweight):定义享元对象需要实现的接口或抽象类.
  • 非共享状态(Unshared State):储存享元对象的非共享状态.

注意:抽象享元和非共享状态角色是可选的,可以省略它们将其功能合并到其他角色中

当客户端请求创建或访问一个享元对象时,享元工厂会检查是否已经创建了该对象.如果已经创建,则返回现有对象的引用;如果尚未创建,则创建新的对象并返回其引用.这样客户端可以共享现有对象,而不必创建新的对象,从而减少内存占用和提高性能.

实现

以电商中的商品信息为例,在电商中,每个商品都有一个名称,价格,库存等属性.通常情况下,每个商品都需要单独创建一个对象,这样会导致内存占用增加,而且如果多次购买相同的商品,系统会创建多个相同的对象,浪费资源.

抽象享元

public interface Product {
    String getName();
    double getPrice();
    int getStock();
}

具体享元

public class ConcreteProduct implements Product{
    private String name;
    private double price;
    private int stock;
    public ConcreteProduct(String name, double price, int stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public double getPrice() {
        return price;
    }
    @Override
    public int getStock() {
        return stock;
    }
}

享元工厂

public class ProductFactory {
    private static Map<String, Product> productMap = new HashMap<>();
    public static Product getProduct(String name, double price, int stock) {
        String key = name + "_" + price;
        Product res = productMap.get(key);
        if (Objects.isNull(res)) {
            // 如果缓存池内不存在,就创建新对象放置到缓存池
            res = new ConcreteProduct(name, price, stock);
            productMap.put(key, res);
        }
        return res;
    }
}

测试

public class Demo {
    public static void main(String[] args) {
        Product p1 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
        Product p2 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
        System.out.println(p1 == p2);
    }
}

在上面示例代码中,首先创建一个商品接口Product,其中包含了商品的名称,价格,库存等属性.然后创建具体的商品类ConcreteProduct,实现Product接口,并定义共享的内部状态name,price,和stock.接下来我们创建商品工厂ProductFactory,用于创建和管理共享的商品对象,在这个工厂中,我们使用HashMap来储存共享的商品对象,每当客户端需要购买一个商品时,我们先检查是否已经创建了该商品对象,如果已经创建,则返回现有对象的引用,如果未创建,则创建新的对象储存到HashMap并返回其引用.

总结

优点

  • 减少对象的创建,节省内存空间,提高系统性能.
  • 通过共享对象,可以使得系统中的相同对象在内存中只存在一份,从而减少内存的开销.
  • 提高系统的可扩展性,如果需要增加新的对象,只需要在工厂中创建即可,不需要修改原有代码.
  • 提高系统的安全性,共享对象是只读的,不会被修改.

缺点

  • 可能会使得系统变得过于复杂,增加了代码的复杂性.
  • 需要额外的工作来维护共享对象的一致性,比如需要考虑线程安全等问题.
  • 可能会因为共享对象的存在而降低程序的灵活性,比如无法对共享对象进行个性化设置.

应用场景

  • 当系统中存在大量相同或相似的对象时,可以考虑使用享元模式来减少内存开销.
  • 当需要缓存对象并且可以复用时,也可以考虑使用享元模式.
  • 在多线程环境下,可以使用享元模式来实现对象的共享,提高程序的并发性能.
  • 在游戏开发中,可以使用享元模式来管理游戏中的角色等对象.

到此这篇关于Java享元设计模式优化对象创建提高性能和效率的文章就介绍到这了,更多相关Java享元设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java基于TCP协议实现聊天程序

    java基于TCP协议实现聊天程序

    这篇文章主要为大家详细介绍了java基于TCP协议实现聊天程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Spring boot测试找不到SpringRunner.class的问题

    Spring boot测试找不到SpringRunner.class的问题

    这篇文章主要介绍了Spring boot测试找不到SpringRunner.class的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • JDK环境变量配置的具体操作步骤

    JDK环境变量配置的具体操作步骤

    本篇文章介绍了,JDK环境变量配置的具体操作步骤。需要的朋友参考下
    2013-05-05
  • Java之JSF框架案例详解

    Java之JSF框架案例详解

    这篇文章主要介绍了Java之JSF框架案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Spring + Spring Boot + MyBatis + MongoDB的整合教程

    Spring + Spring Boot + MyBatis + MongoDB的整合教程

    这篇文章主要给大家介绍了关于Spring + Spring Boot + MyBatis + MongoDB的整合教程,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-12-12
  • Spring Cloud Alibaba Nacos服务治理平台服务注册、RestTemplate实现微服务之间访问负载均衡访问的问题

    Spring Cloud Alibaba Nacos服务治理平台服务注册、RestTemplate实现微服务之间访

    这篇文章主要介绍了Spring Cloud Alibaba:Nacos服务治理平台,服务注册、RestTemplate实现微服务之间访问,负载均衡访问,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • java编程实现根据EXCEL列名求其索引的方法

    java编程实现根据EXCEL列名求其索引的方法

    这篇文章主要介绍了java编程实现根据EXCEL列名求其索引的方法,涉及Java元素遍历与数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • java 生成二维码实例

    java 生成二维码实例

    这篇文章主要介绍了java 生成二维码的实例,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Spring容器注入bean的几种方式详解

    Spring容器注入bean的几种方式详解

    这篇文章主要介绍了Spring容器注入bean的几种方式详解,@Configuration用来声明一个配置类,然后使用 @Bean 注解,用于声明一个bean,将其加入到Spring容器中,这种方式是我们最常用的一种,需要的朋友可以参考下
    2024-01-01
  • Spring Task定时任务的实现详解

    Spring Task定时任务的实现详解

    这篇文章主要介绍了SpringBoot定时任务功能详细解析,这次的功能开发过程中也算是对其内涵的进一步了解,以后遇到定时任务的处理也更清晰,更有效率了,对SpringBoot定时任务相关知识感兴趣的朋友一起看看吧
    2022-08-08

最新评论