详解设计模式:享元模式

news/2024/10/18 3:28:25/

享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式。

享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能。它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式 尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

~

本篇内容包括:关于享元模式、享元模式 Demo


文章目录

    • 一、关于享元模式
        • 1、关于享元模式
        • 2、关于享元模式的构成
        • 3、关于享元模式的XML
        • 4、关于享元模式的应用场景
        • 5、关于享元模式在 Java 中的应用
        • 6、关于享元模式的优缺点
    • 二、享元模式 Demo
        • 1、Demo 设计
        • 2、Demo 实现


一、关于享元模式

1、关于享元模式

享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式。

享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能。它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式 尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

2、关于享元模式的构成

享元模式主要包含四种角色:

  1. 抽象享元(Flyweight)角色:是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
  2. 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
  3. 非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。
  4. 享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。

3、关于享元模式的XML

享元模式

4、关于享元模式的应用场景

当系统中多处需要同一组信息时,可以吧这些信息封装到一个对象中,然后对该对象进行缓存,这样,一个对象就可以提供给多处需要使用的地方,避免大量同一对象多次创建,消耗大量内存空间。
享元模式其实就是工厂模式的一个改进机制,享元模式同样要求创建一个或一组对象,并且就是通过工厂方法生成对象的,只不过享元模式中为工厂方法增加了缓存这一功能。主要总结为以下应用场景:

  1. 常常应用于系统底层的开发,以便解决系统的性能问题。
  2. 系统有大量相似的对象、需要缓存池的场景。

在生活中的享元模式也很常见,比如中介机构的房源共享,再比如全国社保联网。

5、关于享元模式在 Java 中的应用

在 Java 中最直观的享元模式就是在 Boolean,Byte,Integer,Long,Character 这些包装类中,他们都提供了valueOf()方法。

比如:Long 的 valueOf() 方法会缓存数值 -127~128 之间的 Long 对象,在这个范围之间就会直接在这个里面去取,大于这个范围才会去 new Long 对象

public static Long valueOf(long l) {final int offset = 128;if (l >= -128 && l <= 127) { // will cachereturn LongCache.cache[(int)l + offset];}return new Long(l);}private static class LongCache {private LongCache(){}static final Long cache[] = new Long[-(-128) + 127 + 1];static {for(int i = 0; i < cache.length; i++)cache[i] = new Long(i - 128);}}

Byte,Short,Long 的范围是 -127~128 之间。

Character 是 0~127 之间。

Integer 是 -127~128 之间,最小值不能改变,但是最大值可以通过虚拟机参数进行改变。-Djava.long.Intger.IntegerCache.high 来改变

Boolean 缓存了 TRUE 和 FALSE

6、关于享元模式的优缺点

# 享元模式的优点:

  1. 减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率;
  2. 减少内存之外的其它资源占用。

# 享元模式的缺点:

  1. 关注内、外部状态、关注线程安全问题;
  2. 使系统、程序复杂化。

二、享元模式 Demo

1、Demo 设计

俄罗斯方块有不同的形状,我们可以对这些形状向上抽取出 AbstractBox,用来定义共性的属性和行为。

接下来就是定义不同的形状了,IBox类、LBox类、TBox类等。

提供了一个工厂类(BoxFactory),用来管理享元对象(也就是 AbstractBox 子类对象),该工厂类对象只需要一个,所以可以使用单例模式。并给工厂类提供一个获取形状的方法。

2、Demo 实现

# AbstractBox 抽象享元角色

public abstract class AbstractBox {public abstract String getShape();public void display(String color) {System.out.println("方块形状:" + this.getShape() + " 颜色:" + color);}
}

# IBox/LBox/TBox 具体享元角色

public class IBox extends AbstractBox {@Overridepublic String getShape() {return "I";}
}public class LBox extends AbstractBox {@Overridepublic String getShape() {return "L";}
}public class TBox extends AbstractBox {@Overridepublic String getShape() {return "T";}
}

# BoxFactory 享元工厂

public class BoxFactory {private static HashMap<String, AbstractBox> map;private BoxFactory() {map = new HashMap<String, AbstractBox>();AbstractBox iBox = new IBox();AbstractBox lBox = new LBox();AbstractBox oBox = new OBox();map.put("I", iBox);map.put("L", lBox);map.put("O", oBox);}public static final BoxFactory getInstance() {return SingletonHolder.INSTANCE;}private static class SingletonHolder {private static final BoxFactory INSTANCE = new BoxFactory();}public AbstractBox getBox(String key) {return map.get(key);}
}

http://www.ppmy.cn/news/765.html

相关文章

「PAT乙级真题解析」Basic Level 1101 B是A的多少倍 (问题分析+完整步骤+伪代码描述+提交通过代码)

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。 PAT (Basic Level) Practice 1101 B是A的多少倍 问题分析 题设明确要求按照其给定的步骤变换给定的正整数, 然后输出变换后的正整数是输入正整数的多少倍。 所…

LeetCode 刷题系列 -- 1425. 带限制的子序列和

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回 非空 子序列元素和的最大值&#xff0c;子序列需要满足&#xff1a;子序列中每两个 相邻 的整数 nums[i] 和 nums[j] &#xff0c;它们在原数组中的下标 i 和 j 满足 i < j 且 j - i < k 。 数组的子序列定义为…

crm客户管理系统为企业带来的价值

简道云CRM场景套件对中小企业来说&#xff0c;crm客户管理系统最核心的作用&#xff0c;一是客户信息(联系信息和洽谈过程&#xff09;的存留&#xff0c;不会因为业务人员的离职造成流失&#xff0c;这点对老板很重要。二是可帮助业务人员&#xff08;客户获取、主管指导等&am…

HTML+CSS+JavaScript仿京东购物网站制作 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

Spring Cloud教程 第十二弹 Spring Cloud Config整合Spring Cloud Bus实现配置动态刷新

Spring Cloud Config整合Spring Cloud Bus1、回顾2、手动刷新3、Spring Cloud Bus动态刷新配置1、回顾 在上一弹&#xff1a;Spring Cloud教程 第十一弹 Spring Cloud Config连接git和数据库 中介绍了spring cloud config的基本使用&#xff0c;但是配置无法动态刷新&#xff…

计算机毕业设计springboot健身俱乐部会籍管理系统cbz46源码+系统+程序+lw文档+部署

计算机毕业设计springboot健身俱乐部会籍管理系统cbz46源码系统程序lw文档部署 [赠送源码]Springboot校园疫情防控系统h5pmv计算机毕业设计-课程设计-期末作业-毕设程序代做本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&am…

PHP基于thinkphp的在线教学网站#毕业设计

在线教学系统采用B/S模式&#xff0c;促进了在线教学系统的安全、快捷、高效的发展。传统的管理模式还处于手工处理阶段&#xff0c;管理效率极低&#xff0c;随着用户的不断增多&#xff0c;传统基于手工管理模式已经无法满足当前用户需求&#xff0c;随着信息化时代的到来&am…

低代码开发平台助力生产管理:采购成本管理的优化

采购是企业经营活动中的重要环节&#xff0c;它处于企业生产经营活动的最前端&#xff0c;同时也是成本费用中占较大比重的环节。采购成本主要是指企业在生产过程中用于采购产品及服务等交易活动所产生的一系列支出&#xff0c;包括物资的购买价格、税费、运输费等&#xff0c;…