前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >设计模式之享元模式

设计模式之享元模式

作者头像
九转成圣
发布2024-04-10 17:11:30
发布2024-04-10 17:11:30
13500
代码可运行
举报
文章被收录于专栏:csdncsdn
运行总次数:0
代码可运行

享元模式(Flyweight)

定义

代码语言:javascript
代码运行次数:0
复制
通过共享技术,有效地支持大量细粒度的对象。

什么是细粒度对象?一个对象内部包含了多个其他对象?内部包含的对象共享?

使用场景

大量相似对象的情况: 当一个应用程序使用大量相似对象,且这些对象可以被共享时,使用享元模式可以减少内存占用。典型的例子是文本编辑器中的字符对象,其中相同字符只需创建一次并共享。

缓存: 享元模式可以用于实现缓存,特别是在需要频繁访问、计算成本高昂的数据时。将已经计算好的数据缓存起来,并在需要时重用,可以提高系统的性能

连接池: 在数据库连接池、线程池等资源池的设计中,享元模式也经常被应用。共享可用的连接或线程对象,避免频繁地创建和销毁。

作用

  1. 提高性能:生成对象成本比较高,生成之后缓存起来
  2. 降低内存消耗:能用一个对象就别创建两个对象

主要角色

  1. Flyweight:享元接口
  2. ConcreteFlyweight:具体的要被共享的对象
  3. FlyweightFactory:负责给客户端提供共享对象的工厂
  4. UnshareConcreteFlyweight:当不需要共享对象时,但是又需要以统一接口处理此对象,就可以添加这个角色

类图

示例代码

代码语言:javascript
代码运行次数:0
复制
public interface CharFlyweight<CharFlyweight> {
    int compareTo(CharFlyweight o);
}
代码语言:javascript
代码运行次数:0
复制
public class Character implements CharFlyweight<Character> {
    private final char value;

    public Character(char value) {
        this.value = value;
    }

    @Override
    public int compareTo(Character anotherCharacter) {
        return this.value - anotherCharacter.value;
    }

    @Override
    public String toString() {
        char buf[] = {value};
        return String.valueOf(buf);
    }

}
代码语言:javascript
代码运行次数:0
复制
public class CharFactory {
    private static final Map<java.lang.Character, Character> charPool = new HashMap<>();

    public static CharFlyweight getCharacter(char value) {
        if (!charPool.containsKey(value)) {
            charPool.put(value, new Character(value));
        }
        System.out.println(charPool.size());
        return charPool.get(value);
    }
}
代码语言:javascript
代码运行次数:0
复制
public class Client {

    public static void main(String[] args) {
        StringBuilder content = new StringBuilder()
                .append(CharFactory.getCharacter('H'))
                .append(CharFactory.getCharacter('e'))
                .append(CharFactory.getCharacter('l'))
                .append(CharFactory.getCharacter('l'))
                .append(CharFactory.getCharacter('o'));
        System.out.println("content = " + content);

    }
}
代码语言:javascript
代码运行次数:0
复制
1
2
3
3
4
content = Hello

工作中遇到场景

  1. 缓存
  2. 字符串常量池,线程池,连接池
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 享元模式(Flyweight)
  • 定义
  • 使用场景
  • 作用
  • 主要角色
  • 类图
  • 示例代码
  • 工作中遇到场景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档