侧边栏壁纸
博主头像
人生短短几个秋

行动起来,活在当下

  • 累计撰写 45 篇文章
  • 累计创建 20 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

设计模式-享元模式

人生短短几个秋
2025-01-25 / 0 评论 / 0 点赞 / 14 阅读 / 0 字

设计模式 - 享元模式(Flyweight Pattern)

介绍

享元模式是一种结构型设计模式,它通过共享技术来尽可能地复用已创建的对象,从而支持大量细粒度的对象。这种模式可以用来减少内存中对象的数量,尤其是当对象创建成本较高且存在大量重复实例时。

实现

我们以一个文本编辑器中的字符渲染为例来说明享元模式的实现。假设我们需要渲染大量的字符,并且这些字符具有相同的属性(如字体、大小、颜色等),我们希望通过享元模式来减少内存的使用。

定义享元接口

首先定义一个享元接口,它包含共享和非共享的状态。

interface Character {
    void display(int x, int y);
}

创建具体享元类

然后创建具体的享元类,这些类包含了共享的内部状态(如字符本身)。

class SharedCharacter implements Character {
    private char character;
    private Font font;
    private Color color;

    public SharedCharacter(char character, Font font, Color color) {
        this.character = character;
        this.font = font;
        this.color = color;
    }

    @Override
    public void display(int x, int y) {
        System.out.printf("Rendering '%c' at (%d, %d) with font '%s' and color '%s'.%n",
                          character, x, y, font.getName(), color.getName());
    }
}

创建享元工厂

创建一个享元工厂类来管理享元对象的创建和获取。

import java.util.HashMap;
import java.util.Map;

class CharacterFactory {
    private Map<String, Character> pool = new HashMap<>();

    public Character getCharacter(char character, Font font, Color color) {
        String key = getKey(character, font, color);
        if (!pool.containsKey(key)) {
            Character newCharacter = new SharedCharacter(character, font, color);
            pool.put(key, newCharacter);
        }
        return pool.get(key);
    }

    private String getKey(char character, Font font, Color color) {
        return character + ":" + font.getName() + ":" + color.getName();
    }
}

使用享元模式

接下来,在主程序中使用享元模式来渲染字符。

public class TextEditor {
    public static void main(String[] args) {
        CharacterFactory factory = new CharacterFactory();
        Font fontArial = new Font("Arial", 12);
        Color blackColor = new Color("Black");

        // 创建字符 'A'
        Character aChar = factory.getCharacter('A', fontArial, blackColor);
        aChar.display(100, 100); // 输出渲染信息

        // 再次获取字符 'A',应当从池中获取已有的对象
        Character anotherAChar = factory.getCharacter('A', fontArial, blackColor);
        anotherAChar.display(200, 200); // 输出渲染信息

        // 创建字符 'B'
        Character bChar = factory.getCharacter('B', fontArial, blackColor);
        bChar.display(300, 300); // 输出渲染信息
    }
}

定义字体和颜色类

为了完成示例,我们还需要定义字体和颜色类。

class Font {
    private String name;
    private int size;

    public Font(String name, int size) {
        this.name = name;
        this.size = size;
    }

    public String getName() {
        return name;
    }
}

class Color {
    private String name;

    public Color(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

使用场景

享元模式适用于以下情况:

  • 当一个应用程序使用了大量的细粒度对象。
  • 这些对象的大部分状态可以外部化。
  • 许多对象可以用相对较小的存储空间进行共享。
  • 应用程序不依赖于外部状态。

总结

享元模式通过共享对象来减少内存中的对象数量,从而节省内存。这种方式尤其适用于对象创建成本高且存在大量重复实例的情况。享元模式通过享元工厂来管理对象的创建和共享,使得对象的管理和使用变得更加高效。


以上就是享元模式的一个实现案例,希望这篇文章能帮助你理解享元模式的使用方式及其优势。

0

评论区