常用设计模式系列(十二)—享元模式

C++设计模式系列文章汇总 Jungle整理的C++设计模式系列文章出炉了,每一种设计模式都包含: 理论知识:每一种模式的定义、解释 模式UML结构和角色分析:UML类图说明模式的角色和结构 模式应用实例:将设计模式应用于具体的例子,并给出UML实例类图 完整的源代码:完整的代码和运行结果示意图,源代码资源及UML图可在Git上下载 总结:每一种模式的特点和适用环境 设计模式准备工作 设计模式(一)——设计... 阅读详情

常用设计模式系列(十二)—享元模式

第一节

前言

昏昏沉沉的两天过去了,也不知道为什么,突然总觉得很困,可能之前熬夜熬的多了,所以现在可能年纪大了,需要蹦一蹦才能把自己从颓废的边缘拉扯回来,伸出你的手,让我们向于和伟老师学习,来个养生迪(斗图时刻)。

image

蹦完有没有觉得贼精神,精神恢复,我们继续讲解我们的结构型设计模式,今天讲解结构型设计模式第五章节—“享元模式”,“享元”和“外观”一样让人琢磨不透,就像你追你爱慕的女孩的时候,和在一起之后的对比,虽然两段关系不太一样,但是她的心思,那可不是你能一眼猜透的;如何破冰?还是要深入了解,才能更有效的掌握核心信息。那么,“享元”如何代入呢?

可以这么理解,将一个系统中共同的内容抽象出来,多个使用者共用,减少共用内容的冗余,例如:现在国家倡导绿色出行,十个人都拥有自己的私家车,但是国家提供地铁,可以运输几百个人,这样把大家的交通工具抽象出来,抽象为公共交通,减少了街上车子的数量,减少了道路上车子的冗余,这个模式就是享元模式,“将公共元素进行抽象,然后共享这些公共元素”即享元。

第二节

享元模式概念

享元模式(Flyweight
Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式,享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。是不是听起来有点像单例模式?

在这里插入图片描述

1.实现方式不一样,单例是一个类只有一个唯一的实例,而享元可以有多个实例,只是通过一个共享容器来存储不同的对象。

2.使用场景不一样,单例是强调减少实例化提升性能,因此一般用于一些需要频繁创建和销毁实例化对象或创建和销毁实例化对象非常消耗资源的类中,如连接池、线程池。而享元则是强调共享相同对象或对象属性,节约内存使用空间。

在这里插入图片描述
在这里插入图片描述

在系统运行时有大量对象的情况下,有可能会造成堆内存溢出,我们把其中共同的部分抽象出来,抽象为公用对象,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。我们常用的线程池、数据库连接池、常量池等等相关,防止堆内存中对象被重复多次的无限制的创建,进行高效利用,哪里需要往哪里搬。

在这里插入图片描述

目前在我们身边,共享的产品已经渗入我们身边,共享单车、共享汽车、共享充电宝,当共享产品的厂家提供了共享产品时,就意味着这个产品开始了它的轮班生涯,例如共享厂家提供了一个充电宝,我们从这个充电宝的角度去看,第一次用充电宝,如果没有,商家补货,有了就拿走用,这个充电宝属于共享池中,每个厂家规定的派发出去的也是有数量的,不能一直无限的扩展,就意味着池子的大小有限制,如果全部派发出去了,那你就需要等别人还回来才能使用,这些共享产品都统一管理起来在一个池子进行分配,达到共享的目的,这个模式就是享元模式。

在这里插入图片描述

image

此图中抽象充电宝属于抽象享元角色,充电宝A和B是具体享元角色,品牌属于不需要抽象的,传递给享元角色使用,则为非享元角色,充电宝池则为享元工厂。

第三节

代码实现

1.创建非享元对象-品牌

package com.yang.flyweight;


/**
 * @ClassName Power
 * @Description 非享元对象——品牌
 * @Author IT小白架构师之路
 * @Date 2020/12/24
 * @Version 1.0
 **/
public class Version {
    //品牌名称
    private String name;


    public Version(String name){
        this.name = name;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }
}

2.创建充电宝抽象对象

package com.yang.flyweight;


/**
 * @ClassName AbstractRecharge
 * @Description 抽象充电宝对象
 * @Author IT小白架构师之路
 * @Date 2020/12/24
 * @Version 1.0
 **/
public abstract class AbstractRecharge {
    //品牌属性
    protected Version version;


    //状态 0闲置 1使用中
    private String status;


    public String getStatus() {
        return status;
    }


    public void setStatus(String status) {
        this.status = status;
    }


    public AbstractRecharge(String status,Version version){
        this.status = status;
        this.version = version;
    }
    /**
     * 充电方法
     */
    public abstract void recharge();
}

3.创建A类充电宝

package com.yang.flyweight;


/**
 * @ClassName Recharge
 * @Description 充电宝类A
 * @Author IT小白架构师之路
 * @Date 2020/12/24
 * @Version 1.0
 **/
public class RechargeA extends AbstractRecharge{


    public RechargeA(String status,Version version){
        super(status,version);
    }


    /**
     * 充电方法
     */
    public void recharge(){
        System.out.println("我是"+super.version.getName()+"充电宝,我可以充电");
    }
}

4.创建B类充电宝

package com.yang.flyweight;


/**
 * @ClassName RechargeB
 * @Description B类
 * @Author IT小白架构师之路
 * @Date 2020/12/24
 * @Version 1.0
 **/
public class RechargeB extends AbstractRecharge{
    public RechargeB(String status,Version version){
        super(status,version);
    }


    /**
     * 充电方法
     */
    public void recharge(){
        System.out.println("我是"+super.version.getName()+"充电宝,我可以充电");
    }
}

5.创建充电宝池(类似数据库连接池的方式,自动扩容)

package com.yang.flyweight;


import java.util.ArrayList;
import java.util.List;


/**
 * @ClassName RechargeFactory
 * @Description 充电宝池子
 * @Author IT小白架构师之路
 * @Date 2020/12/24
 * @Version 1.0
 **/
public class RechargeFactory {
    /**
     * 充电宝池子最大数量
     */
    private static int maxNum = 5;
    /**
     * 初始化数量
     */
    private static int initNum = 2;




    private static List<AbstractRecharge> list = new ArrayList<AbstractRecharge>();


    static {
        for (int i=0;i<initNum;i++){
           if(i%2==0){
               Version version = new Version("A品牌");
               list.add(new RechargeA("0",version));
           }else{
               Version version = new Version("B品牌");
               list.add(new RechargeB("0",version));
           }
        }
        System.out.println("充电宝数量初始化成功");
    }
    //获取对象
    public static AbstractRecharge getRecharge() throws Exception{
        //总数大小
        int size = list.size();
        System.out.print("充电宝总数大小"+size+",");
        //查看闲置大小
        getHasNum();
        //是否需要等待
        boolean wait = true;
        while (true){
            boolean haveStatus = false;
            for (AbstractRecharge recharge : list){
                //有闲置的对象,直接返回
                if("0".equals(recharge.getStatus())){
                    haveStatus = true;
                    wait = false;
                    recharge.setStatus("1");
                    System.out.println("有可用充电宝,请取走");
                    return  recharge;
                }
            }
            if(!haveStatus){
                if (list.size()>=maxNum){
                    System.out.println("目前无充电宝可用,等待2s");
                    Thread.sleep(2000);
                }else{
                    //新增对象并返回
                    AbstractRecharge recharge;
                    if (size%2==0){
                        Version version = new Version("A品牌");
                        recharge = new RechargeA("0",version);
                    }else{
                        Version version = new Version("B品牌");
                        recharge = new RechargeB("0",version);
                    }
                    wait = false;
                    recharge.setStatus("1");
                    list.add(recharge);
                    return recharge;
                }
            }
        }


    }


    /**
     * 归还充电宝
     * @param recharge
     */
    public static void backRecharge(AbstractRecharge recharge){
        //置闲
        recharge.setStatus("0");
        System.out.println("充电结束,充电宝已归还");
    }


    /**
     * 获取闲置数量
     */
    public static void getHasNum() {
        int num = 0;
        for (AbstractRecharge recharge : list){
            //有闲置的对象,直接返回
            if("0".equals(recharge.getStatus())){
                num++;
            }
        }
        System.out.println("目前闲置数量"+num);
    }
}

6.创建runbale用来测试,执行充电方法

package com.yang.flyweight;


/**
 * @ClassName RechaegeRunnable
 * @Description 注释
 * @Author IT小白架构师之路
 * @Date 2020/12/24
 * @Version 1.0
 **/
public class RechargeRunnable implements Runnable{
    //传入充电宝对象
    private AbstractRecharge recharge;
    private int i;
    public RechargeRunnable(AbstractRecharge recharge,int i){
        this.recharge = recharge;
        this.i = i;
    }


    @Override
    public synchronized void run() {
       try {
           Thread.sleep(5000);
           //调用充电方法
           recharge.recharge();
           int num = i+1;
           //归还充电宝
           RechargeFactory.backRecharge(recharge);
           System.out.println("第"+num+"个线程执行完毕");
       }catch (Exception e){
           e.printStackTrace();
       }
    }
}
  1. 创建客户端测试,创建20个线程测试
package com.yang.flyweight;


import java.util.ArrayList;
import java.util.List;


/**
 * @ClassName Client
 * @Description 注释
 * @Author IT小白架构师之路
 * @Date 2020/12/24
 * @Version 1.0
 **/
public class Client {
    public static void main(String[] args) throws Exception{
        List<Thread> threadList = new ArrayList<Thread>();
        //20个线程同时处理
        for (int i=0;i<20;i++){
            //获取对象
            AbstractRecharge recharge = RechargeFactory.getRecharge();
            //创建新的线程去使用
            RechargeRunnable runnable = new RechargeRunnable(recharge,i);
            //启动线程
            Thread thread = new Thread(runnable);
            thread.start();
            threadList.add(thread);
        }
        //设置当子线程处理完再执行主线程
        for (Thread temp:threadList){
            temp.join();
        }
        System.out.print("结束测试,");
        RechargeFactory.getHasNum();
    }
}

8.测试结果如下,使用享元模式对公用对象进行抽象

充电宝数量初始化成功
充电宝总数大小2,目前闲置数量2
有可用充电宝,请取走
充电宝总数大小2,目前闲置数量1
有可用充电宝,请取走
充电宝总数大小2,目前闲置数量0
充电宝总数大小3,目前闲置数量0
充电宝总数大小4,目前闲置数量0
充电宝总数大小5,目前闲置数量0
目前无充电宝可用,等待2s
目前无充电宝可用,等待2s
目前无充电宝可用,等待2s
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
我是B品牌充电宝,我可以充电
充电结束,充电宝已归还
第4个线程执行完毕
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
第1个线程执行完毕
我是B品牌充电宝,我可以充电
充电结束,充电宝已归还
第2个线程执行完毕
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
第5个线程执行完毕
第3个线程执行完毕
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量4
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量3
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量2
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量1
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量0
目前无充电宝可用,等待2s
目前无充电宝可用,等待2s
目前无充电宝可用,等待2s
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
第6个线程执行完毕
我是B品牌充电宝,我可以充电
充电结束,充电宝已归还
第7个线程执行完毕
我是B品牌充电宝,我可以充电
充电结束,充电宝已归还
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
第10个线程执行完毕
第9个线程执行完毕
第8个线程执行完毕
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量4
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量3
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量2
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量1
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量0
目前无充电宝可用,等待2s
目前无充电宝可用,等待2s
目前无充电宝可用,等待2s
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
我是B品牌充电宝,我可以充电
充电结束,充电宝已归还
第12个线程执行完毕
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
第13个线程执行完毕
我是B品牌充电宝,我可以充电
充电结束,充电宝已归还
第11个线程执行完毕
第14个线程执行完毕
第15个线程执行完毕
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量4
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量3
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量2
有可用充电宝,请取走
充电宝总数大小5,目前闲置数量1
有可用充电宝,请取走
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
我是B品牌充电宝,我可以充电
充电结束,充电宝已归还
第17个线程执行完毕
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
第16个线程执行完毕
我是B品牌充电宝,我可以充电
充电结束,充电宝已归还
第19个线程执行完毕
我是A品牌充电宝,我可以充电
充电结束,充电宝已归还
第18个线程执行完毕
第20个线程执行完毕
结束测试,目前闲置数量5

第四节

享元模式优缺点及适用场景

优点:

1.相同对象可以进行管理,防止创建重复的对象导致内存溢出,这种方式提高了效率。

2.对象统一管理,需要做统一处理的时候则比较方便。

缺点:

1.为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。
2.读取享元模式的外部状态会使得运行时间稍微变长。

适用场景:

1.系统中存在大量相同或者相似对象,且占用较大的内存资源,优化方案可采用享元。

2.大部分的对象可以按照内部状态进行分组,且可将不同的部分分割为外部对象的时候。

3.线程池、数据库连接池等相关场景。

扫描二维码

关注我吧

IT小白架构师之路

image

openEuler 22.03 LTS SP4离线安装UKUI桌面全攻略(附依赖包下载) 本文提供openEuler 22.03 LTS SP4系统离线安装UKUI桌面环境的完整实战指南。针对无网络环境,详细解析了利用dnf工具下载依赖包、配置离线软件源、处理依赖冲突及安装后优化的全流程,并附带了关键依赖包资源,帮助运维人员高效完成图形化部署。 阅读详情

相关推荐

别再手动画柜子了!用EPLAN导入STEP模型,5分钟搞定一个标准机柜

本文详细介绍了如何利用EPLAN Pro Panel的3D布局功能,快速将STEP模型转化为智能机柜宏,大幅提升电气工程设计效率。通过实战步骤解析,包括模型导入、智能解析、安装面定义及拼柜技巧,帮助工程师5分钟内完成标准机柜设计,避免传统手动建模的尺寸偏差问题。

weixin_26875109的博客 433

设计模式系列之十二:享元模式

定义

GlazeChou的博客 361

STM32 FDCAN热插拔恢复机制与自动重发功能优化

本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。

ice55的博客 685

设计模式系列(十二)享元模式

一 基本原理 参考: https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/flyweight.html https://www.cnblogs.com/snowbook/p/5162546.html https://www.cnblogs.com/adamjwh/p/9070107.html 享...

perfectnihil的博客 191

ZYNQ AXI DMA零拷贝实战:用mmap在用户空间玩转高速数据流(基于Petalinux 2020.2)

本文详细介绍了在ZYNQ平台上使用AXI DMA和mmap技术实现零拷贝数据传输的实战方法。基于Petalinux 2020.2环境,通过内核配置、设备树修改和用户空间库设计,大幅提升PS与PL之间的数据传输效率,特别适用于高清视频流、高速AD采样等高性能场景。

weixin_27956639的博客 364

新英格兰10机39节点matlab建模,ieee10机39节点系统数据

【实例简介】ieee10机39节点系统数据,主要是BPA数据!【实例截图】【核心代码】ne_039_bus└── ne_039_bus├── 039readme.doc├── bpa│ ├── 039bpa.dat│ ├── 039bpa.swi│ ├── LFerr.LIS│ ├── OneNote 目录.onetoc2│ └── STERR.LIS├── eurostag│...

weixin_39851809的博客 3273

设计模式(十二):结构型之享元模式

定义运用共享技术来有效地支持大量细粒度对象的复用它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。

从基础到源码解析的学习记录 1631

FreeFEM++下载安装和使用

最近要利用机器学习求解一些偏微分方程,对于一些复杂的偏微分方程,需要一些精度比较高的参考解,导师推荐了FreeFEM++软件。首次使用,特此记录一下,以备以后查阅。 1、FreeFEM++简介 FreeFEM是开源的有限元模拟系统,有法国利翁斯实验室、埃尔和玛丽居里大学共同开发,在世界范围内广泛使用。 2、FreeFEM++去何处下载? 下载地址:https://freefem.org/ 点击Download,然后会跳转到 https://github.com/FreeFem/FreeFem-source

夜晓岚的博客 1万+

23种设计模式(十二)对象性能之享元模式

  享元模式与与单价模式都属于性能模式。都是用来解决对象带来的性能成本的问题。 动机   在软件系统中如果采用纯粹的对象方案,会存在大量细粒度的对象充斥在系统中,从而带来很高的运行时代价–主要指内存需求方面的代价。 设计方法一 flyweight.cpp class Font { private: //unique object key string key; //object state //.... public: Font(const

小小何先生的学习之旅 379

网络基础(二):数制转换与分类编址的IPv4地址

本文介绍数制转换、IP地址、分类编址的IPv4地址,希望对你有帮助!

十七拾的博客 1052

C#海康威视摄像头控制,将IntPtr转换成Bitmap图片

C#通过skd控制海康威视摄像头,获取bitmap格式图片

ReflexMechanism的博客 6586

JAVA设计模式之(十二)享元模式

本文继续介绍23种设计模式系列之享元模式。 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。 在Fl...

riemann_的博客 484

AUTOSAR OS演示项目搭建与验证

请注意,以上代码只是一个简单的示例,用于说明AUTOSAR OS项目的搭建和验证过程。此外,AUTOSAR OS还提供了其他功能和API,如事件、消息队列和任务间通信等,可以根据实际需求进行使用。AUTOSAR OS是AUTOSAR架构中的一部分,它提供了一种可移植且可扩展的操作系统,用于管理嵌入式应用程序的任务和资源。通过以上步骤,我们成功搭建了一个基于AUTOSAR OS的演示项目,并验证了应用程序任务的执行顺序。3、打开app.c文件,并编写一个简单的应用程序,作为我们的示例任务。

weixin_50547796的博客 195

PHP设计模式系列:目录

为了方便查找和学习,现将PHP设计模式系列文章列出目录。PHP设计模式系列:简单工厂模式PHP设计模式系列(一):策略模式PHP设计模式系列(二):装饰模式PHP设计模式系列(三):代理模式PHP设计模式系列(四):工厂方法模式PHP设计模式系列(五):原型模式PHP设计模式系列(六):模板方法模式PHP设计模式系列(七):外观模式PHP设计模式系列(八):建造者模式PHP设计模式系列(九):观察者

qq_32300363的博客 2506

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java结构型设计模式 —— 享元模式的应用

一、引言 哟哟哟,十二月啦 下个月就过大年初一了,不得不说越长大越感觉时间不经用,这篇文章本应该是上周就应该开始写的,上个礼拜被硬生生周末拖过去加班,拖到了这个礼拜的周末。 说实话设计模式这一系列的文章,也包括小编看其他博主所分享的设计模式相关文章,访问量都不是特别多,说明设计模式还不被广大的程序员所重视。 设计模式这种东西你要不学也没有关系,小编之前也说过设计模式之所以存在那么肯定是有它...

贱男 607

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【设计模式】第十一章:享元模式详解及应用案例

它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

Bummon的学习随笔 524

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

AI Chat 设计模式:12. 享元模式

享元模式是一种软件设计模式,用于提高系统的性能和内存利用率。该模式通过共享对象来减少内存消耗,特别是在大量对象需要同时存在的情况下。内部状态和外部状态。内部状态是不随外部环境变化而变化的状态,可以被多个对象共享;而外部状态则是随外部环境变化而变化的状态,每个对象都有自己的外部状态。具体而言,享元模式将对象的创建和管理分为两部分:共享的部分和独立的部分。共享的部分被封装在享元对象中,可以被多个具体对象共享,而独立的部分则由客户端管理。

hejnhong的博客 847

设计模式(十二) 享元模式

Flyweight Pattern1. 什么是享元模式享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。享元模式以共享的方式高效地支持大量细粒度对象的重用,享元对象能做到共享的关键是区

baiiu 918

设计模式篇—常用设计模式—23种设计模式简介

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。最新整理面试题上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题最新整理电子书最新整理大厂面试文档以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!外链图片转存中…(img-P4ulKtlu-1712993134654)]

D1561691的博客 878

设计模式中的装饰模式,外观模式,享元模式,迭代器模式,中介者模式,命令模式,解释器模式,策略模式等

1. 装饰模式_IO流底层架构_装饰和桥接模式的区别 (1)什么是装饰模式? 装饰模式(Decorator)也叫包装器模式(Wrapper) 装饰模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需 要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具 体装饰类。 (2)装饰模式和桥接模式的区别是什么? 两个模式都是为了解决过多子类对象问题。但他们の诱因不一样。桥模...

qq_43364293的博客 293

Java开发中的23种设计模式之十二:享元模式(Flyweight)

12、享元模式(Flyweight) 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。 FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到Jav

专注=效率 763

【设计模式学习笔记十二】【结构型模式】【享元模式(FlyWeight)】

享元模式:运用共享技术有效地支持大量细粒度的对象。系统只使用少量的对象,而这些对象都很相似,状态变化小,可以实现多次复用。又称轻量级模式。 1)能够画出这个设计模式的架构框图; 2)能够根据架构框图写出对应的伪代码; 3)这个模式的应用场景,主要优缺点。

seaicelin的博客 814

java常用的设计模式和开发模式有哪些

一、设计模式的分类 设计模式是不分语言的;前辈们总结出来的设计模式分:3种类型及23种模式: 设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory

wdvceafvcsrgfv的博客 8683

解锁享元模式:内存优化与性能提升的关键密码

解锁Java享元模式:内存优化与性能提升的关键密码

卓越之识论道,平常之识论事,狭隘之识论人 1002

【设计模式系列】总览

努力填完如下表格ing...

LHW0621的专栏 771

深入浅出设计模式【导语、内含23种设计模式和踩坑经验】

设计模式是软件工程中解决常见问题的可复用方案模板,能帮助开发者编写清晰、灵活、可维护的代码。本文将通过系列文章深入解析经典设计模式,包括单例、工厂方法、抽象工厂等,涵盖核心概念、适用场景、类图分析、实现方式及最佳实践。结合Java语言、开源框架和业务案例,旨在为开发者提供理论与实战结合的深度指南,提升系统设计能力。适合希望夯实基础或优化设计的中高级开发者参考。

NeoLshu的博客 969
上一篇: 常用设计模式系列(十一)—外观模式
下一篇: 常用设计模式系列(十三)—组合模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小白架构师之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值