设计模式:享元模式

目录

  • 组件
  • 代码实现
  • 源码中使用
  • 总结

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在通过共享对象来最大程度地减少内存使用和提高性能。享元模式通过共享细粒度的对象,以有效地支持大量细粒度的对象实例。
在享元模式中,对象分为两种类型:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是对象共享的部分,它独立于对象的上下文环境。外部状态是对象的上下文环境,它不可共享并且会影响对象的行为。
享元模式通过将内部状态和外部状态分离,将内部状态存储在共享的数据结构中,以便多个对象可以共享相同的内部状态。这样可以减少内存使用,提高系统的性能。

组件

在享元模式中,通常包含以下组件:

  1. 享元接口(Flyweight Interface):定义享元对象的公共方法,可以是抽象类或接口。
  2. 具体享元(Concrete Flyweight):实现享元接口,并包含内部状态。具体享元对象可以被共享和重用。
  3. 享元工厂(Flyweight Factory):负责创建和管理享元对象。它维护一个享元池(Flyweight Pool)用于存储已创建的享元对象,以便重复使用。
  4. 客户端(Client):使用享元对象的客户端代码。客户端可以通过享元工厂获取享元对象,并根据需要设置外部状态。

代码实现

import java.util.HashMap;
import java.util.Map;
 // 享元接口
interface Flyweight {
    void operation();
}
 // 具体享元类
class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;
     public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }
     public void operation() {
        System.out.println("具体享元对象,内部状态为:" + intrinsicState);
    }
}
 // 享元工厂类
class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();
     public Flyweight getFlyweight(String key) {
        if (flyweights.containsKey(key)) {
            return flyweights.get(key);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
            return flyweight;
        }
    }
}
 // 客户端代码
public class Main {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
         Flyweight flyweight1 = factory.getFlyweight("A");
        flyweight1.operation();
         Flyweight flyweight2 = factory.getFlyweight("B");
        flyweight2.operation();
    }
}

在上述示例中,我们定义了享元接口(Flyweight)和具体享元类(ConcreteFlyweight)。享元工厂类(FlyweightFactory)负责创建和管理享元对象,并使用一个HashMap来存储已创建的享元对象,以便重复使用。

在客户端代码中,我们通过享元工厂来获取享元对象,并调用其操作方法。注意到,虽然我们获取了两个享元对象,但它们的内部状态是相同的,因为它们共享了相同的享元对象。

源码中使用

在源码中,享元模式的应用有很多。以下是一些常见的源码中使用享元模式的情况:

  1. Java中的字符串常量池(String Pool):Java中的字符串常量池使用了享元模式的思想,相同的字符串只会在内存中保存一份,多个引用共享同一个字符串对象,以节省内存空间。
  2. 数据库连接池:数据库连接池使用了享元模式的概念,通过共享数据库连接对象,减少了创建和销毁连接的开销,提高了数据库操作的性能。
  3. 缓存实现:在缓存中,可以使用享元模式来存储和管理缓存对象。相同的数据只需保存一份,多个请求可以共享同一个缓存对象,提高了缓存的效率。
  4. 图形界面中的图元对象:在图形界面的绘图功能中,可以使用享元模式来共享图元对象,减少内存占用,提高绘图的性能。

总结

享元模式在源码中有广泛的应用,主要用于共享和复用对象,以减少内存使用和提高性能。通过共享对象,可以节省内存空间,并提高系统的响应速度。

你可能感兴趣的:(设计模式学习,设计模式,享元模式,java)