设计模式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

实现要点

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

总结

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

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

相关推荐
雷神乐乐3 分钟前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。7 分钟前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野14 分钟前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航16 分钟前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
confiself32 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
Wlq041537 分钟前
J2EE平台
java·java-ee
XiaoLeisj43 分钟前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu1 小时前
Go语言结构体、方法与接口
开发语言·后端·golang