Java享元设计模式优化对象创建提高性能和效率
时间:2023-07-08 07:14:18来源:脚本之家
目录
介绍实现总结优点缺点应用场景

介绍

Java中的享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享尽可能多的对象来减少内存占用和提高性能.


【资料图】

Java享元模式通常包含以下4种角色

享元工厂(Flyweight Factory):负责创建和管理享元对象.具体享元(Concrete Flyweight):实现享元接口并存储与共享状态相关的内部状态.抽象享元(Flyweight):定义享元对象需要实现的接口或抽象类.非共享状态(Unshared State):储存享元对象的非共享状态.

注意:抽象享元和非共享状态角色是可选的,可以省略它们将其功能合并到其他角色中

当客户端请求创建或访问一个享元对象时,享元工厂会检查是否已经创建了该对象.如果已经创建,则返回现有对象的引用;如果尚未创建,则创建新的对象并返回其引用.这样客户端可以共享现有对象,而不必创建新的对象,从而减少内存占用和提高性能.

实现

以电商中的商品信息为例,在电商中,每个商品都有一个名称,价格,库存等属性.通常情况下,每个商品都需要单独创建一个对象,这样会导致内存占用增加,而且如果多次购买相同的商品,系统会创建多个相同的对象,浪费资源.

抽象享元

public interface Product {
    String getName();
    double getPrice();
    int getStock();
}

具体享元

public class ConcreteProduct implements Product{
    private String name;
    private double price;
    private int stock;
    public ConcreteProduct(String name, double price, int stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public double getPrice() {
        return price;
    }
    @Override
    public int getStock() {
        return stock;
    }
}

享元工厂

public class ProductFactory {
    private static Map productMap = new HashMap<>();
    public static Product getProduct(String name, double price, int stock) {
        String key = name + "_" + price;
        Product res = productMap.get(key);
        if (Objects.isNull(res)) {
            // 如果缓存池内不存在,就创建新对象放置到缓存池
            res = new ConcreteProduct(name, price, stock);
            productMap.put(key, res);
        }
        return res;
    }
}

测试

public class Demo {
    public static void main(String[] args) {
        Product p1 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
        Product p2 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
        System.out.println(p1 == p2);
    }
}

在上面示例代码中,首先创建一个商品接口Product,其中包含了商品的名称,价格,库存等属性.然后创建具体的商品类ConcreteProduct,实现Product接口,并定义共享的内部状态name,price,和stock.接下来我们创建商品工厂ProductFactory,用于创建和管理共享的商品对象,在这个工厂中,我们使用HashMap来储存共享的商品对象,每当客户端需要购买一个商品时,我们先检查是否已经创建了该商品对象,如果已经创建,则返回现有对象的引用,如果未创建,则创建新的对象储存到HashMap并返回其引用.

总结

优点

减少对象的创建,节省内存空间,提高系统性能.通过共享对象,可以使得系统中的相同对象在内存中只存在一份,从而减少内存的开销.提高系统的可扩展性,如果需要增加新的对象,只需要在工厂中创建即可,不需要修改原有代码.提高系统的安全性,共享对象是只读的,不会被修改.

缺点

可能会使得系统变得过于复杂,增加了代码的复杂性.需要额外的工作来维护共享对象的一致性,比如需要考虑线程安全等问题.可能会因为共享对象的存在而降低程序的灵活性,比如无法对共享对象进行个性化设置.

应用场景

当系统中存在大量相同或相似的对象时,可以考虑使用享元模式来减少内存开销.当需要缓存对象并且可以复用时,也可以考虑使用享元模式.在多线程环境下,可以使用享元模式来实现对象的共享,提高程序的并发性能.在游戏开发中,可以使用享元模式来管理游戏中的角色等对象.

到此这篇关于Java享元设计模式优化对象创建提高性能和效率的文章就介绍到这了,更多相关Java享元设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

标签:

生活指南
  • 一体化环境保护和生态治理见成效 主要河流泥沙含量大幅减少

    一体化环境保护和生态治理见成效主要河流泥沙含量大幅减少

  • 中汽研秦超:跨界造车能提升数字化转型

    总体路线图的发展战略,前面两个片子可以看到,总体战略最终汽车企业会

  • 死侍3片场照片曝光 休·杰克曼加盟

    7月6日,漫威影业的新作《死侍3》首批片场照片曝光,该片已经确定将于2

  • “MEMS芯片第一股”敏芯股份拟定增募资1.5亿元加码汽车传感器 “超级牛散”现身获配名单

    《科创板日报》7月7日讯(记者吴旭光)7月6日晚间,敏芯股份发布定增预

  • 制造变“智造”!“探”南沙制造业如何抢抓数字化转型先机

    文 羊城晚报全媒体记者冷霜实习生黄明圆7月6日,广州市南沙区工信局牵

  • 陕西省潼关县发布高温橙色预警

    潼关县气象台2023年07月07日10时00分发布高温橙色预警信号:预计今天白

  • “数字人”局长首现数字经济大会

    7月7日下午,2023全球数字经济大会闭幕,北京市经济和信息化局局长姜广

  • 两面针: 公司以牙膏为主衍生至牙刷、漱口水等口腔护理及个人洗护类产品的发展

    两面针(600249)07月07日在投资者关系平台上答复了投资者关心的问题。

  • 足球俱乐部是靠什么赚钱的呢(足球俱乐部是靠什么赚钱的)

    来为大家解答以下的问题,球俱乐部是靠什么赚钱的呢,足球俱乐部是靠什

  • 2023独生子女父母退休有什么补贴和奖励?有人加发800多养老金?

    2023年退休的独生子女父母,有什么奖励?有人加发800多养老金?社保网

  • 手机录屏为什么没有声音?手机录屏最多能录多长时间?_新动态

    手机录屏为什么没有声音?手机录屏没有声音的原因:1、没有开启麦克

  • 又一批银行下调存款利率!美元存款也在降

    又一批银行下调存款利率

  • 复合集流体概念股快速拉升

    复合集流体概念股快速拉升,宝明科技(002992)涨超7%,股价再创历史新高

  • 三大指数集体低开 机器人概念股持续调整

    据新浪财经报导,A股三大指数开盘集体低开,机器人概念股持续调整,南

  • 可以藏在柜子里的床叫什么?床头两边一定要放床头柜吗?_每日报道

    可以藏在柜子里的床叫什么?可以藏在柜子里的床叫翻板床,又称为隐形

  • 全球热文:审计职业道德建设的必要在哪些方面? 审计职业道德在审计工作中的作用体现在哪里?

    审计职业道德建设的必要在哪些方面?职业道德是同人们的职业活动紧密

  • 民生
    • 南丰:西瓜采收忙

    • 一审判了!被害者家庭不服:考虑上诉

    • 爱尔眼科:目前上海地区所有爱尔眼科医院均在合规合法正常运营

    • 国宝画重点丨古代文人的消暑法宝竟是……