魔术桌
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • DesignPattern - 享元模式

文章摘要: 享元模式使用总结。

简介

简要说明

  • 享元模式(Flyweight Pattern)是一种结构型设计模式。
  • 通过共享尽可能多的相似对象来减少内存的使用,提高程序的性能。

主要功能

  • 减少创建对象的数量,减少内存占用和提高性能。
  • 提供共享的接口,使得相同的对象可以被复用。

注意事项

  • 确保对象是不可变对象,以保证共享的安全性。
  • 分离内部状态(固有属性)和外部状态(可变属性),内部状态可以被共享,外部状态则不可以。
  • 需要管理对象池,以实现对象的共享。

适用场景

  • 当一个程序中使用了大量的对象。
  • 这些对象造成了很大的内存开销。
  • 这些对象的大多数状态可以外部化。
  • 这些对象是不可变的。

Java 8

案例

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

// 享元接口,定义了享元对象需要实现的操作
interface Flyweight {
    void operation(String extrinsicState);
}

// 具体的享元类,实现了享元接口
class ConcreteFlyweight implements Flyweight {
    // 内部状态,即享元对象的固有属性,可以被共享
    private String intrinsicState;

    // 构造方法,初始化内部状态
    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    // 实现operation方法,使用外部状态
    @Override
    public void operation(String extrinsicState) {
        System.out.println("Intrinsic State = " + this.intrinsicState);
        System.out.println("Extrinsic State = " + extrinsicState);
    }
}

// 享元工厂,负责创建和管理享元对象
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 FlyweightPatternDemo {
    public static void main(String[] args) {
        // 创建享元工厂
        FlyweightFactory factory = new FlyweightFactory();

        // 通过享元工厂获取享元对象
        Flyweight flyweight1 = factory.getFlyweight("key1");
        Flyweight flyweight2 = factory.getFlyweight("key2");

        // 操作享元对象,传入外部状态
        flyweight1.operation("Extrinsic State A");
        flyweight2.operation("Extrinsic State B");

        // 再次获取享元对象,此时将复用已存在的享元对象
        Flyweight flyweight3 = factory.getFlyweight("key1");
        flyweight3.operation("Extrinsic State C");

        // 检查flyweight1和flyweight3是否为同一个对象
        System.out.println(flyweight1 == flyweight3); // 输出true
    }
}

注释

  • 在这个例子中,我们定义了一个享元接口Flyweight和一个具体的享元类ConcreteFlyweight。享元工厂FlyweightFactory负责创建和管理享元对象,并使用一个HashMap作为享元池来存储共享的享元对象。
  • 客户端代码通过享元工厂获取享元对象,并传入外部状态进行操作。当请求相同的享元对象时,享元工厂将返回已经创建的享元对象,从而实现对象的共享。在最后,我们检查了两个引用是否指向同一个对象,以验证享元对象的共享。
更新时间: 2025/10/3 17:56