03-JAVA设计模式-享元模式

享元模式

什么是享元模式

享元模式(Flyweight Pattern)是一种对象结构型设计模式,用于减少创建对象的数量,以减少内存占用和提高系统性能。它通过共享已经存在的对象来避免创建大量相似的对象,从而降低内存消耗。

在享元模式中,通常会有一些细粒度的对象,它们具有一些共同的属性,但是某些属性可能会变化。

  • 优点
    • 减少对象数量:通过共享对象,可以显著减少系统中对象的数量,从而节省内存空间。
    • 提高性能:由于减少了对象的创建和销毁,可以提高系统的性能。
  • 缺点
    • 增加系统复杂性:引入享元模式可能会增加系统的复杂性,特别是当处理内在状态和外在状态的分离时。
    • 可能不适用于所有场景:不是所有情况都适合使用享元模式,例如当对象的状态变化非常频繁时,共享对象可能不是最佳选择。

核心

  • 享元模式以共享的方式高效的支持大量细粒度对象的复用。
  • 享元对象能做到共享的关键是区分了内部状态和外部状态。
    • 内部状态:可以共享,不会岁环境变化发生改变
    • 外部状态:不可以共享,会随环境变化二改变

享元模式的实现

  • 抽象享元类(Flyweight):通常是一个接口或者抽象类,声明公共的方法,这些方法可以想外界提供对象的内部状态及设置外部状态
  • 具体享元类(ConcreteFlyweight):为内部状态提供成员变量进行存储
  • 非共享享元类(UnsharedConcreteFlyweight):不能为共享的子类可以设计成非共享享元类
  • 享元工厂(FlyweightFactory):创建并管理享元对象享元池一般设计成键值对

案例

对于围棋,棋子进行简单可以划分:
内部状态:颜色
外部状态:棋盘坐标

UML

在这里插入图片描述

实现步骤:

  1. 定义外部状态:地址Address

  2. 定义享元接口:提供操作外部状态的接口,通过传入地址获取外部状态地址的信息

  3. 定义享元接口的实现(围棋)

    • 通过属性设置内部状态,并提供内部状态的设置及调用方法(这里只提供了设置方法)
    • 通过实现享元接口,传入外部状态调用外部状态方法或获取外部状态属性
  4. 享元工厂

    • 定义享元池(通常以键值对形式缓存),用于缓存共享内部状态(该方法只适用单线程,多线程需要进行优化)
    • 提供获取内部状态的方法,如果享元池中已存在,则享元池中对象,否则新建一个对象并设置到享元池中

代码实现

Address.java

// 定义外部状态
public class Address {
    private int x;
    private int y;

    public Address(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
}

Flyweight.java

// 享元接口:
// *  提供操作外部状态的接口
public interface Flyweight {
    // 获取棋子信息:
//     *  通过传入地址获取外部状态地址的信息
    void getInfo(Address address);
}

ChessPieces.java

//定义享元接口的实现:
// 围棋:
//  通过属性设置内部状态,并提供内部状态的设置及调用方法(这里只提供了设置方法)、
//  通过实现享元接口,传入外部状态调用外部状态方法或获取外部状态属性
public class ChessPieces implements Flyweight{
    private String color;

    public ChessPieces(String color) {
        this.color = color;
    }

    @Override
    public void getInfo(Address address) {
        System.out.printf("颜色:%s,坐标:x=%s,y=%s%n",color,address.getX(),address.getY());
    }
}

FlyweightFactory.java

import java.util.HashMap;
import java.util.Map;

// 享元工厂
// * 定义享元池(通常以键值对形式缓存),用于缓存共享内部状态(该方法只适用单线程,多线程需要进行优化)
// * 提供获取内部状态的方法,如果享元池中已存在,则享元池中对象,否则新建一个对象并设置到享元池中
public class FlyweightFactory {

    // 定义享元池
    private Map<String, Flyweight> mapPool = new HashMap<String, Flyweight>();

    // 提供获取内部状态的方法
    public Flyweight getChessPieces(String key){
        Flyweight flyweight = mapPool.get(key);
        if(flyweight == null){
            flyweight = new ChessPieces(key);
            mapPool.put(key, flyweight);
        }
        return flyweight;
    }
}

TestClient.java

public class TestClient {
    public static void main(String[] args) {
        FlyweightFactory flyweightFactory = new FlyweightFactory();
        Flyweight chessPieces = flyweightFactory.getChessPieces("白色");
        chessPieces.getInfo(new Address(1,2));
    }
}

执行结果:

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/537277.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP 计划策略82简介

前面的文章中我们已经测试了很多才策略,10、11、40、50、70、60、63 80策略。 本文将重点说明ATO模式下82策略的使用场景,计划策略82是SAP提供的另一种基于按单生产思想的计划策略,由客户的需求来直接驱动直接生产,是一个按单生产的场景。 1、首先我们先看下系统后台82策略…

为什么都在做白银投资?略谈现货白银的投资优势

在各种主要的投资产品中&#xff0c;现货白银可以说是比较具有优势的一种。近期现货白银价格不断攀升&#xff0c;已经突破了28.00大关&#xff0c;这更是引起了很多朋友对现货白银投资的兴趣。下面我们就来讨论一下&#xff0c;现货白银的投资优势有哪些。 交易灵活。投资现货…

嵌入式岗位“面试失败”的宝贵经验分享

面试失败&#xff0c;在所难免。从中汲取教训和经验才最关键。面试并不只是用人单位挑选应聘者&#xff0c;同样也是应聘者从面试中获取相关工作信息的好渠道。 1.每面完一次试&#xff0c;认真回顾整个面试 很多人面试一出来&#xff0c;就像考完一场试一样&#xff0c;把…

专访安霸CEO王奉民:怎么帮助OEM在智驾上和特斯拉竞争

采访| 德新 撰文| 苗岭 整个2023年&#xff0c;安霸CEO王奉民两次到访中国&#xff0c;一次是参加上海车展&#xff1b;另一次&#xff0c;他拜访了所有能约上的主机厂及Tier 1客户。 王奉民积极地出现在国内&#xff0c;跟安霸当前押注汽车领域有关。 这家成立于2004年的芯…

鸿蒙内核源码分析 (物理内存篇) | 怎么管理物理内存

如何初始化物理内存&#xff1f; 鸿蒙内核物理内存采用了段页式管理&#xff0c;先看两个主要结构体。结构体的每个成员变量的含义都已经注解出来&#xff0c;请结合源码理解. #define VM_LIST_ORDER_MAX 9 //伙伴算法分组数量&#xff0c;从 2^0&#xff0c;2^1&#…

我的小程序接口被刷爆了

自然流量的惊喜 书接上文&#xff0c;凭着短视频的好奇&#xff0c;搭了个小程序&#xff0c;做了文案提取&#xff0c;配音等功能&#xff0c;也顺带写了两篇口水文章&#xff0c;不曾想居然收获历史最高的点赞与收藏。有兴趣的朋友可以点这里一看究尽&#xff1a;《短视频配音…

ZL-WK-4五孔注意力测试系统

简单介绍&#xff1a; 五孔注意力测试系统基于视觉上的辨别力&#xff0c;通过运行5-CSRTT任务(5-choice serial reaction time task)&#xff0c; 测试动物的注意力、冲动性(impulsivity)等一系列行为学指标&#xff0c;主要用于注意力缺失/多动综合症(attention deficit/hype…

若依框架判断是否关闭了某个页面,或者在关闭某个页面进行操作

src\plugins\tab.js // 关闭指定tab页签closePage(obj) {console.log(obj,obj)if (obj undefined) {return store.dispatch(tagsView/delView, router.currentRoute).then(({ lastPath }) > {return router.push(lastPath || /);});}if(obj.fullPath "/plugin/workfl…

RabbitMQ消息模型之Fanout消息模型

Fanout消息模型 * 广播模型&#xff1a;* 一个交换机绑定多个队列* 每个队列都有一个消费者* 每个消费者消费自己队列中的消息&#xff0c;每个队列的信息是一样的生产者 package com.example.demo02.mq.fanout;import com.example.demo02.mq.util.ConnectionUtils; impor…

2023年金融贷款骗局套路之一

源地址&#xff1a;2023年金融贷款骗局套路之一_预防网贷套路_计算机技术网 随着无卡消费的日夜流行&#xff0c;三年疫情出现&#xff0c;钱难寻&#xff0c;难找的尴尬境地&#xff0c;贷款骗局也出现不少。今天我们讲讲最近很流行的贷款骗局之一中的一种贷款骗局。 在平常…

C++设计模式|0.前言

1.什么是设计模式&#xff1f; 简答来说&#xff0c;设计模式就是一套好用的代码经验总结&#xff0c;也就是怎么写好代码的方法论。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。 2.设计模式的分类 设计模式可以分为三类&#xff1a;创建型、…

【Unity渲染】渲染管线原理

整理自B站UPKerry佬的视频【【教程】技术美术入门&#xff1a;渲染管线概述】 https://www.bilibili.com/video/BV1Q54y1G7v3/?share_sourcecopy_web&vd_source7e6249c05fba6efe32e8867373f75917 应用阶段 、几何阶段顶点处理、光栅化、片元处理、输出合并 应用阶段是CUP…

WebSocket一篇讲清楚

文章目录 WebSocket简介WebSocket与HTTP的区别WebSocket的工作原理WebSocket的应用场景WebSocket的使用WebSocket 属性WebSocket 事件WebSocket 方法 WebSocket的心跳机制WebSocket 的安全性和跨域问题如何处理&#xff1f;有哪些好用的客户端WebSocket第三方库总结 WebSocket简…

2024年 Mathorcup高校数学建模竞赛(B题)| 甲骨文识别 | 特征提取,图像分割解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;通过神经网络解决甲骨文识别问题。结合特征提取&#xff0c;图像分割等多元算法&…

如何在Windows通过固定tcp公网地址ssh远程访问本地Kali Linux

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 本文主要介绍如何在Kali系统编辑SSH配置文件并结合cpolar内网穿透软件&#xff0c;实现公网环境ssh远程连接本地kali系统。 1. 启…

科技云报道:大模型加持后,数字人“更像人”了吗?

科技云报道原创。 北京冬奥运AI 虚拟人手语主播、杭州亚运会数字人点火、新华社数字记者、数字航天员小诤…当随着越来越多数字人出现在人们生活中&#xff0c;整个数字人行业也朝着多元化且广泛的应用方向发展&#xff0c;快速拓展到不同行业、不同场景。 面向C端&#xff0…

appium

app元素抓取在线工具 Appium Inspector by Appium Pro appium安装&#xff08;通过node.js安装&#xff09; Python3Appium安装使用教程_python_脚本之家 Node version is 18.17.1

CST软件中变更求解器和宏的使用技巧【操作教程】

变更求解器 变更CST MWS中的Solver&#xff01; Home > Simulation > Setup Solver CST Microwave Studio (CST MWS)总共有六个Solver。用户根据仿真目的和应用方向选择合适的Solver&#xff0c;才可以快速获得准确的结果。变更或选择Solver时&#xff0c;在Setup Sol…

DNS正反向解析

1.先连接X-shell 主服务器&#xff1a;192.168.32.168&#xff08;server&#xff09; 从服务器&#xff1a;192.168.32.169&#xff08;node&#xff09; 2.给主从服务器做准备工作 [rootserver ~]# setenforce 0 setenforce: SELinux is disabled [rootserver ~]# systemc…