设计模式Java实现-享元模式

✨这里是第七人格的博客✨小七,欢迎您的到来~✨

🍅系列专栏:设计模式🍅

✈️本篇内容: 享元模式✈️

🍱本篇收录完整代码地址:gitee.com/diqirenge/d... 🍱

楔子

享元模式是一种设计模式,用于减少创建对象的数量,提高系统性能。它通过共享相同状态的对象来减少内存占用和提高性能。和我们之前使⽤原型

模式通过克隆对象的⽅式⽣成复杂对象,有异曲同工之处。

需求背景

我们有一个秒杀系统,秒杀的商品信息是预热后固定不变的,以前我们是直接从数据库中查,现在要求你从内存中加载。

分析设计

在秒杀场景中,可以将商品信息存储在一个共享的数据结构中,如哈希表或缓存。当需要查询某个商品时,首先从共享数据结构中查找,如果找到了就直接返回,否则再创建一个新的商品对象并存储到共享数据结构中。

UML图

根据分析设计,我们可以先画一个简单的UML图,后面通过UML图编码

模块名称

flyweight

模块地址

gitee.com/diqirenge/d...

模块描述

享元模式代码示例

代码实现

1、提供一个简单的产品类

java 复制代码
/**
 * 一个简单的产品类
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/18
 */
public class Product {
    private String id;
    private String name;

    public Product(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2、编写享元工厂

他比一般的工厂多了一个缓存,当需要一个产品时,先在缓存中查找,如果存在,则直接返回,如果不存在,则创建一个新的

java 复制代码
/**
 * 享元工厂
 * 他比一般的工厂多了一个缓存,当需要一个产品时,先在缓存中查找,如果存在,则直接返回,如果不存在,则创建一个新的
 *
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/18
 */
public class ProductFactory {
    private static final Map<String, Product> PRODUCTS = new HashMap<>();

    /**
     * 在这个示例中,我们使用了一个静态的HashMap来存储共享的商品对象。
     * 当需要获取一个商品对象时,首先检查HashMap中是否已经存在该对象,如果不存在,则创建一个新的商品对象并将其添加到HashMap中;
     * 如果已经存在,则直接返回该对象。这样可以避免频繁地创建和销毁商品对象,从而提高查询性能。
     *
     * @param id id
     * @param name name
     * @return {@link Product}
     */
    public static Product createProduct(String id, String name) {
        String key = id + "-" + name;
        if (!PRODUCTS.containsKey(key)) {
            PRODUCTS.put(key, new Product(id, name));
        }
        return PRODUCTS.get(key);
    }

}

3、编写测试类

java 复制代码
/**
 * 享元模式
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/18
 */
public class FlyweightTest {
    @Test
    public void test_flyweighty() {
        Product product1 = ProductFactory.createProduct("1", "商品1");
        Product product2 = ProductFactory.createProduct("1", "商品1");
        Product product3 = ProductFactory.createProduct("2", "商品2");

        // 输出 true,表示 product1 和 product2 是同一个对象
        System.out.println(product1 == product2);
        // 输出 false,表示 product1 和 product3 不是同一个对象
        System.out.println(product1 == product3);
    }
}

4、测试结果

true

false

实现要点

享元模式的核心思想是使用一个共享的内存空间来存储相同类型的对象,从而减少对象的创建和销毁开销。

总结

享元模式是一种设计模式,用于减少创建对象的数量,提高系统性能。它通过共享相同状态的对象来减少内存占用和提高性能。和我们之前使⽤原型

模式通过克隆对象的⽅式⽣成复杂对象,有异曲同工之处。享元模式的核心思想是使用一个共享的内存空间来存储相同类型的对象,从而减少对象的创建和销毁开销。

相关推荐
CircleMouse5 分钟前
springboot如何通过提供的注解方式来操作Redis
java·spring boot·redis·spring·mybatis
阿海打酱油9 分钟前
idea经常卡顿解决办法
java·ide·intellij-idea
bing_15826 分钟前
Spring Boot 项目中什么时候会抛出 FeignException?
java·spring boot·后端
Java&Develop1 小时前
springboot + mysql8降低版本到 mysql5.7
java·spring boot·后端
sg_knight1 小时前
从单体架构到微服务:架构演进之路
java·spring boot·spring·spring cloud·微服务·云原生·架构
武昌库里写JAVA1 小时前
MacOS Python3安装
java·开发语言·spring boot·学习·课程设计
eternal__day1 小时前
Spring Cloud:构建云原生微服务架构的最佳工具和实践
java·spring cloud·微服务·云原生·架构
cdut_suye1 小时前
【Linux系统】从 C 语言文件操作到系统调用的核心原理
java·linux·数据结构·c++·人工智能·机器学习·云计算
forestsea1 小时前
Maven 插件参数注入与Mojo开发详解
java·maven·mojo
荔枝吻2 小时前
【抽丝剥茧知识讲解】引入mybtis-plus后,mapper实现方式
java·sql·mybatis