【设计模式】享元模式

  • 享元模式属于结构型设计模式

    核心思想是通过共享技术,实现相似对象的高效复用。用 1%的资源支撑100%的需求------通过对象状态的分离与共享,用最小内存支持海量对象

    内部状态:对象中不变的部分共享

    外部状态:对象中变化的部分非共享

适用场景

  • 系统中存在大量相似或相同的对象
  • 对象创建/销毁成本较高
  • 对象状态可以外部变化,即对象状态独立于对象本身存在。

核心组件

  • 享元接口:定义外部状态的方法,规定可以共享的状态
  • 实现类:实现类,存储内部状态,实现具体业务逻辑
  • 享元工厂:用于对象池的管理,控制对象的创建和复用

类图

java 复制代码
//抽象 享元类
public abstract class AbstractBikeFlyWeight {

    private String color;

    private int price;

    public AbstractBikeFlyWeight(String color, int price) {
        this.color = color;
        this.price = price;
    }
    
    
    public abstract String show();

}
//实现类
public class OneBike extends AbstractBikeFlyWeight {
    

    public OneBike(String color, int price) {
        super(color, price);
    }

    @Override
    public String show() {
        return "one bike color: " + color + " price: " + price;
    }
}

public class TwoBike extends AbstractBikeFlyWeight {

    public TwoBike(String color, int price) {
        super(color, price);
    }

    @Override
    public String show() {
        return "two bike color: " + color + " price: " + price;
    }
}

//工厂
public class Factory {

    private static Map<String,AbstractBikeFlyWeight> bikeMapping = new HashMap<>();

    public static AbstractBikeFlyWeight getBike(String color, String type) {
        String key = color + type;

        if (bikeMapping.containsKey(key)) {
            return bikeMapping.get(key);
        }else  {
            AbstractBikeFlyWeight bike;
            switch (color) {
                case "one":
                    bike = new OneBike();
                    break;
                case "two":
                    bike = new TwoBike();
                    break;
                default:
                    throw new IllegalArgumentException("Invalid color: " + color);
            }
            bike.setColor(color);
            bike.setType(type);
            return bike;
        }

    }

}

模式的优点缺点

优点

  • 内存优化:可以减少对象的存储
  • 性能提升:降低GC压力,提高缓存命中率
  • 资源复用:避免重复资源的浪费

缺点

  • 增加系统的复杂性:需要区分可共享和不可共享的逻辑
  • 需要考虑线程安全的场景

总结

当系统面临对象数量爆炸性增长,占用内存过大的情况,可以考虑是否使用享元模式。同时还要确认对象是否存在可复用的逻辑以及多少状态可以在外部传递进行处理。

相关推荐
_日拱一卒3 分钟前
LeetCode:矩阵置零
java·数据结构·线性代数·算法·leetcode·职场和发展·矩阵
weixin_408099677 分钟前
【实战教程】懒人精灵如何实现 OCR 文字识别?接口调用完整指南(附可运行示例)
java·前端·人工智能·后端·ocr·api·懒人精灵
花千树-01023 分钟前
Java Agent 集成 MCP 工具协议:让 AI 真正驱动企业系统
java·ai·langchain·ai agent·mcp·harness·j-langchain
橘子编程28 分钟前
GoF 23 种设计模式完整知识总结与使用教程
java·c语言·开发语言·python·设计模式
UrSpecial30 分钟前
设计模式:模板方法模式
设计模式·模板方法模式
君以思为故33 分钟前
认识Linux -- 线程同步与互斥
java·开发语言
被摘下的星星38 分钟前
Java接口需要注意的细节
java·开发语言
培风图南以星河揽胜41 分钟前
幻想简历!博主本人期望的 AI Agent 全栈简历:Java + Python + Vue3 跨语言实战,代码已开源!
java·人工智能·python
鬼先生_sir1 小时前
Dubbo:从入门到精通
java·dubbo·springcloud
艾莉丝努力练剑1 小时前
【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
java·linux·运维·服务器·c语言·c++·学习