【结构型】享元模式(Flyweight)

2023-09-15 17:09:00

享元模式(Flyweight)

运用共享技术有效地支持大量细粒度的对象。(业务模型的对象进行细分得到科学合理的更多对象)

适用场景

  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量的对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象标识。由于 Flyweight 对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。
    在这里插入图片描述

✦ Flyweight 描述一个接口,通过这个接口 Flyweight 可以接受并作用于外部状态。
✦ ConcreteFlyweight 实现 Flyweight 接口,并为内部状态(如果有)增加存储空间。 ConcreteFlyweight 对象必须是可共享的。它所存储的状态必须是内部的,即它必须独立于 ConcreteFlyweight 对象的场景。
✦ 并非所有的 Flyweight 子类都需要被共享。Flyweight 接口使共享成为可能,但它并不强制共享。在 Flyweight 对象结构的某些层次,UnsharedConcreteFlyweight 对象通常将 ConcreteFlyweight 对象作为子结点。
✦ FlyweightFactory 创建并管理 Flyweight 对象;确保合理地共享 Flyweight ,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个己创建的实例或者在不存在时创建一个实例。
✦ Client 维持一个对 Flyweight 的引用;计算或存储一个或多个 Flyweight 的外部状态。

享元模式实例代码(Java)

import java.util.*;

// Flyweight
abstract class Shape {
    protected String color;
    public abstract void draw(int x, int y);
}

// ConcreteFlyweight
class Circle extends Shape {
    public Circle(String color) {
        this.color = color;
    }
    @Override
    public void draw(int x, int y) {
        System.out.println("draw a color:" + color + " circle x:" + x + " y:" + y);
    }
}

// FlyweightFactory
class ShapeFactory {
	// FlyweightFactory创建并管理Flyweight对象;
	// 确保合理地共享 Flyweight ,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个己创建的实例或者在不存在时创建一个实例。
    private Map<String, Shape> map = new HashMap<String, Shape>();

    public Shape getShape(String key) {
        if (!map.containsKey(key)) {
            map.put(key, new Circle(key));
            System.out.println("create color:" + key + " circle");
        }
        return map.get(key);
    }
}

public class FlyWeightMain {
    public static void main(String[] args) {
        ShapeFactory factory = new ShapeFactory();

        Random random = new Random();
        String[] colors = {"red", "blue", "green", "white", "black"};

        for (int i = 1; i <= 100; i++) {
            int x = random.nextInt(colors.length); // [0 ~ 4]
            Shape shape = factory.getShape(colors[x]);

            System.out.print("第" + i + "个圆:");
            shape.draw(random.nextInt(2022), random.nextInt(528));
        }
    }
}

其他设计模式详见本专栏其他博文~
特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
zst_2001的个人空间

更多推荐

从丢失msvcp140_codecvt_ids.dll到修复,解决方法详解

在日常计算机使用过程中,我们有时会遇到一些烦人的错误提示。其中之一就是丢失了msvcp140_codecvt_ids.dll文件。当我们打开某些应用程序或游戏时,可能会收到类似于“找不到msvcp140_codecvt_ids.dll”或“该应用程序无法正常启动”的错误信息。这可能会影响我们的工作效率或是影响我们游戏的

字符串函数----篇章(1)

目录补上章缺失的两道题七.笔试题(7)八.笔试题(8)一.字符串函数(1)----strlen函数二.字符串函数(2)----strcpy函数2-1模拟实现strcpy三.字符串函数(3)----strcmp函数​编辑3-1模拟实现strcmp四.字符串函数(4)----strcat函数​编辑4-1模拟实现strcat

IBM LSF 任务调度系统的主要术语和概念

LSF术语和概念了解IBMLSF基本术语和概念。作业状态IBM®SpectrumLSF作业具有多个状态。PEND正在队列中等待调度和分派。RUN已分派到主机并正在运行。DONE正常完成,退出值为零。EXIT已完成,具有非零退出值。PSUSP作业处于暂挂状态时已暂挂。USUSP由用户暂挂。SSUSP由LSF系统暂挂。PO

博格华纳高压发卡式电机解析

博格华纳的高压发卡式电机具有功率强大、坚固耐用和高性能等特点,采用紧凑型设计,优化的导体绕组结构缩短了电机的尺寸,使其便于在更小的空间内进行安装,并提高了常用区间的工作效率。此外,电机在设计上减少了重稀土元素,降低了电机成本,通过优化辅助槽,实现了出色的噪声(NVH)、振动及舒适度的表现,在满足客户对汽车静谧性需求的同

SLAM从入门到精通(服务通信)

【声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxing@163.com】前面我们谈到了消息通信,但是这种通信是单向的。也就是一个人发送消息,一个人接收消息,仅此而已。在ros当中,还有一种通信,称之为服务通信。它和单项通信最大的区别就是,我们把数据发送给对方,还能得到对方的反馈结果。这在很多场合

AIGC|从革新内容创作到社会共识建立,迎接全新技术维度

在人工智能的巨浪之下,我们身临一场前所未有的文化演变,一股革命性的力量正在重新定义我们的创造性边界。这股力量不是人类的智慧,而是人工智能生成内容(AIGC)技术,它正以前所未有的速度和广度改变着我们的世界。从创意到实用,从文化到商业,AIGC技术正引领着我们进入一个崭新的时代,在其中,既有挑战也有机遇。当前,新技术的广

ruoyi框架开发LOT项目

背景最近闲着就用ruoyi的框架写了一个LOT项目,个人觉得效果还可以。1、首页2、企业管理3、用户管理4、设备列表5、设备列表标签展示6、设备详情页面7、大屏展示界面8、结束-----华丽的分割线,以下是凑字数,大家不用花时间看,快去改代码----------华丽的分割线,以下是凑字数,大家不用花时间看,快去改代码-

Android StringFog 字符串自动加密

一、StringFog作用一款自动对dex/aar/jar文件中的字符串进行加密Android插件工具,正如名字所言,给字符串加上一层雾霭,使人难以窥视其真面目。可以用于增加反编译难度,防止字符串代码重复。支持java/kotlin。支持app打包生成的apk加密。支持aar和jar等库文件加密。支持加解密算法的自主扩

基于SSM的四六级报名与成绩查询系统的设计与实现

末尾获取源码开发语言:JavaJava开发工具:JDK1.8后端框架:SSM前端:采用JSP技术开发数据库:MySQL5.7和Navicat管理工具结合服务器:Tomcat8.5开发软件:IDEA/Eclipse是否Maven项目:是目录一、项目简介二、系统功能三、系统项目截图​编辑四、核心代码登录相关文件上传封装五、

思腾云计算

思腾合力成立于2009年,于2018年8月将总部从北京中关村迁到天津滨海区。思腾合力专注人工智能领域,拥有自主品牌AI服务器及通用X86服务器,为NVIDIA精英级别的合作伙伴,公司扎根高性能计算领域多年,已经打造出了一套完全自主的软硬件结合的产品生态。思腾合力位于天津滨海区逸仙科学工业园建筑面积6000平方米的人工智

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

热文推荐