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

实现要点

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

总结

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

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

相关推荐
2202_754421547 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
蓝染-惣右介9 分钟前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
小林想被监督学习10 分钟前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose12 分钟前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
我只会发热14 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
是老余15 分钟前
本地可运行,jar包运行错误【解决实例】:通过IDEA的maven package打包多模块项目
java·maven·intellij-idea·jar
crazy_wsp15 分钟前
IDEA怎么定位java类所用maven依赖版本及引用位置
java·maven·intellij-idea
.Ayang18 分钟前
tomcat 后台部署 war 包 getshell
java·计算机网络·安全·web安全·网络安全·tomcat·网络攻击模型
一直学习永不止步23 分钟前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
博风33 分钟前
设计模式:6、装饰模式(包装器)
设计模式