设计模式:享元模式案例

让我们以游戏开发中的棋类游戏(例如国际象棋)为例来展示享元模式的代码实现。在这个例子中,棋子的类型是内部状态,而棋子的位置是外部状态。

Java 代码示例

import java.util.HashMap;
import java.util.Map;// 享元接口
interface ChessPieceFlyweight {void move(int x, int y); // 外部状态:位置String getColor(); // 内部状态:颜色
}// 具体享元类
class ConcreteChessPiece implements ChessPieceFlyweight {private final String color; // 内部状态public ConcreteChessPiece(String color) {this.color = color;}@Overridepublic void move(int x, int y) {System.out.printf("Moving %s piece to (%d,%d).\n", color, x, y);}@Overridepublic String getColor() {return color;}
}// 享元工厂
class ChessPieceFactory {private static final Map<String, ChessPieceFlyweight> pieces = new HashMap<>();public static ChessPieceFlyweight getChessPiece(String color) {if (!pieces.containsKey(color)) {ChessPieceFlyweight piece = new ConcreteChessPiece(color);pieces.put(color, piece);}return pieces.get(color);}
}// 客户端代码
public class FlyweightExample {public static void main(String[] args) {ChessPieceFlyweight whitePiece = ChessPieceFactory.getChessPiece("White");ChessPieceFlyweight blackPiece = ChessPieceFactory.getChessPiece("Black");// 棋子被多次移动到不同位置,但对象是共享的whitePiece.move(1, 2);blackPiece.move(2, 3);whitePiece.move(4, 5);// ... 其他棋子移动操作}
}

在这个例子中,ChessPieceFlyweight 接口定义了棋子的外部状态方法 move 和内部状态方法 getColorConcreteChessPiece 类实现了这个接口,并持有内部状态 color,它在棋子的生命周期中是不变的。

ChessPieceFactory 类是享元工厂,它确保同一颜色的棋子只创建一次,并在之后的请求中返回已创建的实例。这样,即使在棋盘上有多个同色棋子,实际上它们都是由同一个享元实例代表的。

客户端代码通过享元工厂获取棋子实例,并多次调用 move 方法来改变棋子的位置,这些位置信息作为外部状态在每次调用时传入。

这个例子展示了享元模式如何在需要大量相似对象的情况下减少内存消耗,通过共享实例来避免重复创建相同或相似的对象。

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

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

相关文章

windows 系统下 mysql 数据库的下载与安装(包括升级安装)

windows 系统下 mysql 数据库的下载与安装&#xff08;包括升级安装&#xff09; 一、mysql 介绍&#xff1a; MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。 MySQL 是最流行的关系型数据库管理系统之一&#xf…

Springboot的事务管理

在Service层的方法头顶上加上Transactional 声明这个方法是个事务&#xff0c;要么都成功&#xff0c;要么都失败。 这经常用于批量操作&#xff0c;避免第一次没成功&#xff0c;执行第二次的时候重复插入相同数据&#xff0c;或者有些插入删除操作未被执行&#xff0c;就开…

从300亿分子中筛出6款,结构新且易合成,斯坦福抗生素设计AI模型登Nature子刊

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 全球每年有近 500 万人死于抗生素耐药性&#xff0c;因此迫切需要新的方法来对抗耐药菌株。 …

5G时代下电子元器件电商平台的发展策略与应对措施

在5G时代下&#xff0c;电子元器件电商平台的发展策略与应对措施需要考虑以下几个关键因素&#xff1a; 技术产品更新换代&#xff1a; 随着5G技术的普及和应用&#xff0c;电子元器件的需求将发生变化&#xff0c;对于支持5G技术的电子元器件的需求会增加&#xff0c;而对于旧…

llama2的python视角

1 调试代码 if __name__ __main__ :config ModelArgs(dim8, n_layers2, n_heads32, n_kv_heads32, vocab_size32000, hidden_dimNone, multiple_of256, norm_eps1e-05, max_seq_len3, dropout0.0)model Transformer(config)input_tokens torch.randint(0, 32000, (1, 3)) …

【已解决】HalconDotNet.HOperatorException:“HALCON error #1201: Wrong type of control

前言 最近在学习Halcon视觉和C#的联合开发&#xff0c;碰到一个比较有意思的问题记录一下&#xff0c;大致的报错信息是说我用的halcondotnet版本和我在halcon导出的使用的halcondotnet.dll版本不一致&#xff0c;所以才报错的&#xff01; 解决 首先你得找到你安装halcon的…

大模型技术ollama入门教程

下载 下载&#xff1a;https://ollama.com/download 我下载的是Windows版本&#xff1a; Docker启动 使用Docker启动要更简单点。 拉取镜像&#xff1a; docker pull ollama/ollama使用CPU启动&#xff1a; docker run -d -v ollama:/root/.ollama -p 11434:11434 --nam…

设计模式面试题(六)

1.什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种构建复杂对象的最佳方式。这种模式允许你将一个复杂对象的构造过程分解成若干个简单的步骤&#xff0c;这样可以使最终对象的构建过程和表示方式分离&…

云骑士数据恢复怎么授权别的电脑

随着科技的不断发展&#xff0c;数据恢复已经成为了我们生活中不可或缺的一部分。云骑士数据恢复作为一款功能强大的数据恢复软件&#xff0c;受到了广泛的欢迎。但是&#xff0c;有时候我们需要将云骑士数据恢复授权给其他电脑使用&#xff0c;这就需要我们了解相关的操作步骤…

夯实智慧新能源数据底座,TiDB Serverless 在 Sandisolar+ 的应用实践

本文介绍了 SandiSolar通过 TiDB Serverless 构建智慧新能源数据底座的思路与实践。作为一家致力于为全球提供清洁电力解决方案的新能源企业&#xff0c;SandiSolar面临着处理大量实时数据的挑战。为了应对这一问题&#xff0c;SandiSolar选择了 TiDB Serverless 作为他们的数据…

【JAVASE】带你了解instanceof和equals的魅力

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1.instanceof instanceof 是 Java 的保留关键字。它的作用是测试…

【排列回溯】Leetcode 46. 全排列 47. 全排列 II

【排列回溯】Leetcode 46. 全排列 47. 全排列 II 46 全排列——used数组上下层保证不取重复的即可47. 全排列 II——used去重上下层&#xff0c;再去重本层重复元素 46 全排列——used数组上下层保证不取重复的即可 ---------------&#x1f388;&#x1f388;题目链接&#x…

Redis数据库的入门学习

关系型数据库和非关系型数据库的区别&#xff1a; 简介 Redis数据库和MySql数据库的区别&#xff1a;Redis数据库是基于内存的key-value结构的数据库。本质上是内存存储。 而MySql数据库是通过数据文件的方式存在磁盘当中&#xff0c;本质上是磁盘存储。且MySql当中是通过二维…

考研数学|《880题》这样刷效率最高,效果最好!

考研数学880题是很多考生在备考过程中会选择的一本习题集&#xff0c;它涵盖了大量的基础题、综合题和拓展题&#xff0c;对于巩固知识点和提升解题能力非常有帮助。针对你的情况&#xff0c;这里提供一些建议来提高刷题效率。 首先在过完1800基础篇后&#xff0c;你已经具备了…

C++ 枚举类型 ← 关键字 enum

【知识点&#xff1a;枚举类型】● 枚举类型&#xff08;enumeration&#xff09;是 C 中的一种派生数据类型&#xff0c;它是由用户定义的若干枚举常量的集合。 ● 枚举元素作为常量&#xff0c;它们是有值的。C 编译时&#xff0c;依序对枚举元素赋整型值 0,1,2,3,…。 下面代…

Python数据分析十七

一、Python之判断运算符is和isnot 在Python中&#xff0c;我们可以使用is和is not运算符来判断两个对象是否相同或不相同。下面我将为你详细讲解is和is not运算符的用法&#xff0c;并给出相应的代码示例。 1.is运算符&#xff1a; is运算符用于检查两个对象是否引用同一个内…

题目 3147: 异或和之和

题目描述: 给定一个数组 Ai&#xff0c;分别求其每个子段的异或和&#xff0c;并求出它们的和。或者说&#xff0c;对于每组满足 1 ≤ L ≤ R ≤ n 的 L, R &#xff0c;求出数组中第 L 至第 R 个元素的异或和。然后输出每组 L, R 得到的结果加起来的值。 代码: package lan…

java爬虫入门程序

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…

第十讲 Query Execution Part 1

1 处理模型【Processing Model】 DBMS 的处理模型【Processing Model】定义了系统如何执行【execute】查询计划【Query Plan】。 针对不同的工作负载进行不同的权衡。 方法1&#xff1a;迭代器模型【Iterator Model】 方法2&#xff1a;物化模型【Materialization Model】 方…

【Spring Cloud Alibaba】9 - OpenFeign集成Sentinel实现服务降级

目录 一、简介Sentinel 是什么如何引入Sentinel 二、服务搭建1.安装Sentinel控制台1.1 下载1.2 启动1.3 访问 2.改造服务提供者cloud-provider服务2.1 引入依赖2.2 添加API2.3 添加配置文件 3.改造cloud-consumer-feign服务3.1 引入依赖3.2 添加Feign接口3.3 添加服务降级类3.4…