惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Vercel News
Vercel News
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
N
Netflix TechBlog - Medium
Google DeepMind News
Google DeepMind News
H
Help Net Security
罗磊的独立博客
The Cloudflare Blog
J
Java Code Geeks
博客园 - 叶小钗
I
InfoQ
B
Blog
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
月光博客
月光博客
博客园_首页
雷峰网
雷峰网
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
美团技术团队
T
The Blog of Author Tim Ferriss
博客园 - 司徒正美

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈
设计模式-享元模式 - OXOXTECH 牛牛技术客栈
Jensen · 2024-04-17 · via 牛牛技术客栈

设计模式-享元模式

Jensen Java Java, 设计模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(8)外观模式》文章中,我们介绍了外观模式。本文是这个系列的第九篇章,我们将讲解一下享元模式的实现方式、应用场景以及它的用途。

享元模式

享元模式是一种结构型设计模式,是通过共享对象来减少内存使用和提高性能。在该模式中,对象分为内部状态外部状态,其中内部状态是可共享的,而外部状态是不可共享的。通过共享内部状态,可以减少系统中重复对象的数量,从而减少内存消耗。

使用场景

  1. 当一个应用程序使用大量相似对象时,享元模式可以帮助减少内存消耗。
  2. 当对象的大部分状态可以外部化并且可以在多个对象中共享时,可以考虑使用享元模式。
  3. 当需要频繁创建和销毁对象,且创建对象的代价比维护对象的代价高时,可以使用享元模式来减少创建对象的数量。

代码实现

使用享元模式实现内外部状态描述;定义一个Flyweight接口

/**
 * 享元接口
 * @author Jensen
 * @date 2024-02-28
 * */
public interface Flyweight {
    void operation(String state);
}

创建 FlyweightImpl类 并实现状态的具体操作

public class FlyweightImpl implements Flyweight {
    private final String innerState;

    public FlyweightImpl(String innerState) {
        this.innerState = innerState;
    }

    @Override
    public void operation(String state) {
        System.out.println("外部状态是:"+state+","+"内部状态是:"+innerState);
    }
}

随后创建享元工厂类 FlyweightFactory  它负责管理 Flyweight 对象的创建和共享。

/**
 * 享元工厂
 * @author Jensen
 * @date 2024-02-28
 * */
public class FlyweightFactory {
    private final Map<String,Flyweight> flyweightMap = new HashMap<>();
    public Flyweight getFlyweight(String k){
        return flyweightMap.computeIfAbsent(k, FlyweightImpl::new);
    }
}

测试使用

System.out.println("------------------------------享元模式-----------------------------");
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight anxiety = flyweightFactory.getFlyweight("焦虑");
anxiety.operation("平淡");
anxiety.operation("开朗");

这里就简单的实现内部状态是可共享的,而外部状态是不可共享的;外部状态不管怎么变,其内部状态仍然是“焦虑”的。

image.png

结语

其实享元模式还有很多其他的应用场景,比如:

  • 在文本编辑器中,字符对象可以使用享元模式来共享相同的字符,节省内存空间。
  • 在游戏中,精灵对象可能存在大量重复,通过享元模式来共享相同的精灵对象,减少内存占用和提高渲染性能。
  • 在数据库连接池中的连接对象可以使用享元模式来复用,减少连接对象的创建和销毁,提高系统性能。等等。