享元模式Flyweight

news2024/9/30 1:26:06

1.意图:运用共享技术有效地支持大量细粒度的对象。
2.结构
在这里插入图片描述

描述一个接口,通过这个接口Flyweight可以接受并作用于外部状态;
ConcreteFlyweight实现Flyweight接口,并为内部状态(如果有)增加存储空间。ConreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的,即它必须独立于ConcreteFlyweight对象的场景;
并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子结点;
FlyweightFactory创建并管理Flyweight对象;确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者在不存在时创建一个实例;
Client维持一个对Flyweight的引用,计算或存储一个或多个Flyweight的外部状态。
3.适用性:
一个应用程序使用了大量的对象;
完全由于使用大量的对象,造成了很大的存储开销;
对象的大多数状态都可变为外部状态;
如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象;
应用程序不依赖于对象标识。由于Flyweight对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。
代码案例
享元模式主要用于减少创建对象的数量,以低内存占用,提高性能。开发一个网络围棋程序允许多个玩家联机下棋。由于只有一台服务器,为节省内存空间,采用享元模式实现该程序。

import java.util.ArrayList;
/**
 * 享元模式
 */
public class FlyWeight {
    public static void main(String[] args) {
        PieceBoard board = new PieceBoard("张三","李四");
        PiecePos pos1 = new PiecePos(4,6);
        board.setPiect(PieceColor.BLACK,pos1);
        PiecePos pos2 = new PiecePos(2,6);
        board.setPiect(PieceColor.WHITE,pos2);
    }
}
enum PieceColor{BLACK,WHITE}//棋子颜色
class PiecePos{//棋子位置
    private int x;
    private int y;
    public PiecePos(int a ,int b){
        x = a;
        y = b;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
}
abstract class Piece{//棋子定义
    protected PieceColor m_color;//颜色
    protected PiecePos m_pos;//位置
    public Piece(PieceColor color,PiecePos pos){
        m_color = color;
        m_pos = pos;
    }
    public abstract void draw();
}
class BlackPiece extends Piece{
    public BlackPiece(PieceColor color, PiecePos pos) {
        super(color, pos);
    }
    @Override
    public void draw() {
        System.out.println("draw a blackPiece");
    }
}
class WhitePiect extends Piece{
    public WhitePiect(PieceColor color, PiecePos pos) {
        super(color, pos);
    }
    @Override
    public void draw() {
        System.out.println("draw a whitePiece");
    }
}
class PieceBoard{//棋盘上已有的棋子
    private static final ArrayList<Piece> m_arrayPiece = new ArrayList<>();
    private String m_blackName;//黑方名称
    private String m_whiteName;//白方名称
    public PieceBoard (String black,String white){
        m_blackName = black;
        m_whiteName = white;
    }
    //一步棋,在棋盘上放一个棋子
    public void setPiect(PieceColor color, PiecePos pos){
        Piece piece = null;
        if(color == PieceColor.BLACK){//放黑子
            piece = new BlackPiece(color,pos);//获取一颗黑子
            System.out.println(m_blackName+"放在位置("+pos.getX()+","+pos.getY()+")");
            piece.draw();
        }else{//放白子
            piece = new BlackPiece(color,pos);//获取一颗白子
            System.out.println(m_whiteName+"放在位置("+pos.getX()+","+pos.getY()+")");
            piece.draw();
        }
        m_arrayPiece.add(piece);
    }
}

运行结果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超融合时序数据库YMatrixDB与PostGIS案例

目录 什么是PostGIS PostGIS的特点 PostGIS 基础知识 OGC的WKB和WKT格式 插入数据实例 EWKT、EWKB和Canonical格式 插入数据实例 SQL-MM格式 常几何类型和函数 常用操作符 常用操作函数 OGC标准函数 管理函数 几何对象关系函数 几何对象处理函数 几何对象存取函…

Redis中的事务可以满足ACID属性吗?

前言 事务是数据库操作的最小工作单元&#xff0c;由一个有限的数据库操作序列构成。这些操作要么全部执行&#xff0c;要么全部不执行&#xff0c;是一个不可分割的工作单位。一键获取最先java文档。 事务在执行时&#xff0c;会提供专门的属性保证&#xff1a;原子性、一致性…

[附源码]Python计算机毕业设计Django高校学生摄影作品展示平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

sentinel读取监控文件分析

主要分析的类 com.alibaba.csp.sentinel.dashboard.metric.MetricFetcher在sentinel监控数据db持久化中&#xff0c;更换了MetricController的存储实现&#xff0c;可以发现com.alibaba.csp.sentinel.dashboard.repository.metric.MetricsRepository原来只有com.alibaba.csp.s…

第4季3:Hi3518e的sensor接口引脚复用设置

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 在第2、3季的内容中&#xff0c;在板载系统的配置脚本即/etc/profile文件中&#xff0c;都有如下这句代码&#xff1a; ./load3518e -i -sensor ar0130 -osmem 32 -total 64 在第4季1&#xff1a…

MAC glucuronide linker-1/MAC glucuronide linker-2蛋白降解酶

ERRa_PROTAC&#xff08;Cpd11&#xff0c;D1oonM40%&#xff09;蛋白降解活性随着Linker的增长而减弱。Linker -(CHz)s-的化合物13d在浓度30 nM时能够降解58%的蛋白&#xff0c;浓度为100 nM时能够降解78%的ERRα蛋白&#xff0c;其降解活性不如 13c。Linker -(CHz)z-的13f&…

java计算机毕业设计ssm齐市疫苗管理系统w80jw(附源码、数据库)

java计算机毕业设计ssm齐市疫苗管理系统w80jw&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校心理咨询管理系统0e78p

大部分步骤是 1.确定选题 选题的确定需要查阅大量的资料&#xff0c;要搞清楚自己大概想要研究的方向是什么。可以选择自己感兴趣的学科或者强势的学科进行研究&#xff0c;同时要多和毕业指导老师多交流&#xff0c;征求老师的意见和建议&#xff0c;最后确立选题。计算机专业…

面试官:你知道 Java 中的回调机制吗?

调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种。 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b(), 一直等待b()方法执行完毕, a()方法继续往下走. 这种调用方式适用于方法b()执…

【论文速读】Scene Text Telescope: Text-Focused Scene Image Super-Resolution

前言 在阅读这篇文章的时候&#xff0c;我花费了近一周的时间在将其基本消化理解&#xff0c;至于为什么花费如此长的时间&#xff0c;我发现主要原因是我对transformer一知半解&#xff0c;所以在transformer中提出的名词&#xff0c;例如&#xff1a;Postion-Wise Feed-Forw…

365天深度学习训练营-第P3周:天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 内部限免文章&#xff08;版权归 K同学啊 所有&#xff09;&#x1f366; 参考文章地址&#xff1a; &#x1f517;第P3周&#xff1a;天气识别 | 365天深度学习训练营&#x1f356; 作者&#xff1a;K同学啊 | 接辅导、…

视频转文字怎么操作?这三种转换方法你该学会

如今短视频让各种知识传播变得生动形象&#xff0c;但是视频学习对于后期的整理复习不是很便捷&#xff0c;现在教大家一种好用的视频知识整理方法&#xff0c;那就是视频转文字&#xff0c;可以将视频内容轻松转换为文字形式。那么就有人问了&#xff0c;怎样转换才更简单呢&a…

WeakHashMap 和 HashMap 的区别是什么,何时使用?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 在之前的文章里&#xff0c;我们聊到了 Java 标准库中 HashMap 与 LinkedHashMap 的实现原理。HashMap 是一个标准的散列表数据结构&…

eval()方法字符串转对象; 分别取对象属性名和属性的方法

字符串转对象 ⬇️ A是字符串 转对象&#xff1a; let B eval(‘ (‘ A ‘) ‘) B就是A转成的对象 取对象属性名(for ... in ... ) ⬇️ let C []; for(let key in B) { C.push(key); console.log(key); // 打印所有属性名 console.log(B[key]); // 打印所有属性值…

“元宇宙”虚拟世界的营销法则 “品牌元宇宙空间”算什么?

虚拟世界从来不缺吃螃蟹的品牌。 “元宇宙”依旧是当下品牌创新营销的重要形式&#xff0c;从时趣的行业观察来看&#xff0c;大量品牌方都有着元宇宙的营销意向&#xff0c;但在营销落地上存在不同的进度。一个显而易见的事实是&#xff0c;元宇宙不仅仅是一个虚拟的游戏空间…

RabbitMQ之负载均衡-HAProxy

将客户端的连接和操作的压力分散到集群中的不同节点&#xff0c;防止单个或几台服务器压力过大成为访问的瓶颈&#xff0c;甚至宕机。HAProxy是一款开源免费&#xff0c;并提供高可用性、负载均衡以及基于TCP和HTTP协议的代理软件&#xff0c;可以支持四层、七层负载均衡&#…

虚拟列表渲染-前端性能优化

目录 1 使用场景 2 小插曲 3 虚拟列表渲染实现原理 4 代码实现 1 使用场景 在做EMBP项目时&#xff0c;有个模板新建的需求&#xff0c;需要点击获取子任务时获取所有的子任务&#xff0c;当时有的数据比较大&#xff0c;会有几百条的情况&#xff0c;此时接口请求变得很慢…

高可用网站架构云化

高可用网站架构云化 一、背景 早期互联网产品用户量少&#xff0c;并发量低&#xff0c;数据量小&#xff0c;多数只需要单个应用服务器可以满足需要&#xff0c;而数据库和文件服务部署在外部单个服务器上。随着业务在线化、互联网化的高速发展&#xff0c;企业对核心业务系统…

微信云开发AI短视频一键换脸小程序源码

简介&#xff1a; 微信云开发AI一键视频换脸小程序源码是由极客二改后发布的&#xff0c;小程序增加了广告控制&#xff0c; 插屏广告&#xff0c;激励广告和原生广告&#xff0c;由于采用了微信云开发没有后台&#xff0c; 所以不需要域名和服务器也可以正常搭建使用&#xf…

【论文精读6】MVSNet系列论文详解-CIDER

CIDER全名&#xff1a;Learning Inverse Depth Regression for Multi-View Stereo with Correlation Cost Volume,AAAI 2020(CCF A) 本文是MVSNet系列的第6篇&#xff0c;建议看过【论文精读1】MVSNet系列论文详解-MVSNet之后再看便于理解。 一、问题引入 针对问题&#xff1a…