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

实现要点

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

总结

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

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

相关推荐
℡余晖^13 分钟前
每日面试题18:基本数据类型和引用数据类型的区别
java
LoveC52120 分钟前
设计模式之适配器模式
设计模式·适配器模式
hello 早上好31 分钟前
消息顺序、消息重复问题
java·中间件
phltxy1 小时前
ArrayList与顺序表
java·算法
Livingbody1 小时前
【心理咨询师数字孪生对话数据集】标准化为 ShareGPT OpenAI 格式
后端
Doris_LMS1 小时前
保姆级别IDEA关联数据库方式、在IDEA中进行数据库的可视化操作(包含图解过程)
java·mysql·postgresql
衍生星球1 小时前
JSP 程序设计之 Web 技术基础
java·开发语言·jsp
Java编程乐园1 小时前
Java函数式编程之【Stream终止操作】【下】【三】【收集操作collect()与分组分区】【下游收集器】
java
yinyan13141 小时前
一起学springAI系列一:初体验
java·人工智能·ai
永卿0012 小时前
设计模式-责任链模式
java·设计模式·责任链模式