小蔡学Java

Java之设计模式 (十七)

2023-09-27 09:38 1421 0 设计模式 设计模式享元模式

享元模式(Flyweight Pattern)

  享元模式是一种结构型设计模式,它通过共享对象来减少内存占用和提高系统性能。享元模式适用于大量细粒度的对象,这些对象具有相似的属性,而且这些属性可以被共享。   在享元模式中,我们将对象分为两种:

内部状态指对象共享的部分,可以被多个对象共享;

外部状态则指对象独有的部分,不能被共享。

  通过将内部状态抽取出来,我们可以减少系统中需要创建的对象数量,从而降低内存消耗。

使用场景

当一个应用程序需要创建大量的相似对象时,使用享元模式可以减少内存占用和提高系统性能

当一个对象的状态可以被拆分为内部状态和外部状态时,使用享元模式可以将内部状态共享,从而减少对象数量和内存消耗。

当一个应用程序需要使用缓存来提高性能时,可以使用享元模式来实现缓存功能,从而提高系统性能。

代码实现

  使用享元模式实现一个简单的字符串存储库,它可以存储大量的字符串,同时尽可能节省内存。   首先定义一个 Flyweight 接口,它表示共享的字符串对象。具体的字符串对象将实现这个接口。

public interface Flyweight {
    void print(String str);
}

  接下来,定义一个具体的 Flyweight 实现类,它包含一个字符串值和一个计数器,用于记录该字符串的使用次数

public class ConcreteFlyweight implements Flyweight {
    private String value;
    private int count;

    public ConcreteFlyweight(String value) {
        this.value = value;
        this.count = 0;
    }

    @Override
    public void print(String str) {
        System.out.println("Printing " + value + " for " + str);
        count++;
    }

    public int getCount() {
        return count;
    }
}

  然后,定义一个 FlyweightFactory 工厂类,它负责管理 Flyweight 对象并根据需要创建它们。

public class FlyweightFactory {
    private static final Map<String, Flyweight> flyweights = new HashMap<>();

    public static Flyweight getFlyweight(String value) {
        Flyweight flyweight = flyweights.get(value);
        if (flyweight == null) {
            flyweight = new ConcreteFlyweight(value);
            flyweights.put(value, flyweight);
        }
        return flyweight;
    }
}

  最后,定义一个 Client 类,它负责使用 Flyweight 对象来存储字符串

public class Client {
    public static void main(String[] args) {
        String[] strings = {"hello", "world", "hello", "java", "world"};

        for (String str : strings) {
            Flyweight flyweight = FlyweightFactory.getFlyweight(str);
            flyweight.print(str);
        }

        System.out.println("Flyweight count: " + FlyweightFactory.flyweights.size());
        for (Flyweight flyweight : FlyweightFactory.flyweights.values()) {
            System.out.println("String: " + ((ConcreteFlyweight) flyweight).value +
                    ", Count: " + ((ConcreteFlyweight) flyweight).getCount());
        }
    }
}

  在这个示例中,使用 FlyweightFactory 来管理共享的字符串对象。每个具体的 Flyweight 实现类都包含一个字符串值和一个计数器,用于记录该字符串的使用次数。当 Client 类使用 FlyweightFactory 来存储字符串时,它将创建或获取一个共享的 Flyweight 对象,并使用它来存储字符串。最后,我们可以查看 FlyweightFactory 中保存的所有 Flyweight 对象,以及它们的使用次数。 使用小结   使用享元模式可以显著降低内存消耗并提高系统的性能。比如:

Java 中的字符串池是一个存储字符串对象的池子,可以共享字符串对象,而不是为每个字符串都创建一个新的实例。

Java 中的数据库连接池可以缓存一些已经建立好的数据库连接,当需要使用数据库时,可以直接从连接池中获取连接,而不需要每次都创建一个新的连接。这样可以大大提高数据库的访问效率和性能。

评论( 0 )

  • 博主 Mr Cai
  • 坐标 河南 信阳
  • 标签 Java、SpringBoot、消息中间件、Web、Code爱好者

文章目录