设计模式——享元模式

享元模式

定义

享元模式(Flyweight Pattern)是池技术的重要实现方式。

使用共享对象可以有效地支持大量的细粒度对象。

优缺点、应用场景

优点

可以大大减少应用程序创建对象的数量,降低程序内存占用。

缺点

提高了系统的复杂度,需要分离出享元对象的外部状态(key)和内部状态(对象属性),并且外部状态应该有可常量化的特性(如:String、int),否则导致系统的逻辑混乱

应用场景

  1. 大量相似的对象
  2. 享元对象应该具有相似的外部状态(对外标识的key的生成逻辑相同)
  3. 需要缓冲池的场景

代码模拟场景

从平家boy缓冲池中拣选一些boy进入地牢。。。

享元模式

UML图

在这里插入图片描述

抽象享元对象——PingjiaBoy

/*** 享元角色抽象 平家boy*/
public abstract class PingjiaBoy {/*** 提取对象池的KEY*/protected String key;/*** 名字*/private String name;/*** 职业*/private String job;/*** 权力*/private String power;public PingjiaBoy(String key) {this.key = key;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public String getPower() {return power;}public void setPower(String power) {this.power = power;}
}

享元对象示例——PingjiaBoyPool

/*** 享元角色实例 平家boy候选池*/
public class PingjiaBoyPool extends PingjiaBoy {public PingjiaBoyPool(String key) {super(key);}public String getKey() {return key;}public void setKey(String key) {this.key = key;}
}

享元工厂——PingjiaBoyFactory

/*** 享元工厂 黑暗♂地牢*/
public class PingjiaBoyFactory {/*** 创建一个boy的预备候选池*/private final static Map<String, PingjiaBoy> BOY_POOL = new HashMap<>();/*** 根据key挑选平家boy惩罚** @param key key* @return 平家boy*/public static PingjiaBoy getPingjiaBoy(String key) {PingjiaBoy result;// 如果池中没有这个boy,则添加if (!BOY_POOL.containsKey(key)) {System.out.println(key + " Take it boy...");result = new PingjiaBoyPool(key);BOY_POOL.put(key, result);} else {// 存在则直接拣♂选出来result = BOY_POOL.get(key);System.out.println(key + " Come on...");}return result;}
}

入口类方法

private static void takeItBoy() {for (int i = 0; i < 3; i++) {String color = "肤色" + i;for (int j = 0; j < 10; j++) {String key = color + "样貌" + j;PingjiaBoyFactory.getPingjiaBoy(key);}}PingjiaBoy pingjiaBoy = PingjiaBoyFactory.getPingjiaBoy("肤色2样貌8");System.out.println(pingjiaBoy);
}

结果

在这里插入图片描述

参考书籍

秦小波《设计模式之禅》

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

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

相关文章

【杨氏矩阵】

这篇文章的对应思维导图为&#xff1a;思维导图 思维导图对应代码&#xff1a; //杨氏矩阵 #include<stdio.h>//void ysjz1(int a[3][3],int k) { // int x 0; // int y 2; // while (x < 2 && y > 0) { // if (a[x][y] > k) { // y--; // } // …

微服务系列文章 之SpringBoot之定时任务详解

序言 使用SpringBoot创建定时任务非常简单&#xff0c;目前主要有以下三种创建方式&#xff1a; 一、基于注解(Scheduled)二、基于接口&#xff08;SchedulingConfigurer&#xff09; 前者相信大家都很熟悉&#xff0c;但是实际使用中我们往往想从数据库中读取指定时间来动态…

机器学习-线性代数-5-空间中的向量投影与最小二乘法

空间中的向量投影与最小二乘法 文章目录 空间中的向量投影与最小二乘法一、引入二、投影和投影的描述1、投影描述最近2、利用矩阵描述投影(1)向一维直线投影(2)向二维平面投影(3)向n维子空间投影的一般情况 三、最小二乘法1、重要的子空间(1)互补的子空间(2)正交的子空间(3)相互…

微服务day1

一、认识微服务 1、单体架构 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 优点 架构简单部署成本低 缺点 耦合度高 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPfsQXAn-1689593800699)(https://picture.wangkay.tec…

gitee 使用

1.打开git bash 2.cd 进入到合适位置 3.git clone 项目 4.配置用户名和email&#xff08;不然没法记录谁操作的&#xff09; pycharm &#xff08;ctrlk&#xff09;

如何设计一个注册中心?(2)实现注册接口

1. 创建SpringBoot工程 创建父工程及三个子模块&#xff0c;其中一个模块作为注册中心&#xff0c;另外两个作为服务提供者。 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns…

pytorch保存、加载和解析模型权重

1、模型保存和加载 主要有两种情况&#xff1a;一是仅保存参数&#xff0c;二是保存参数及模型结构。 保存参数&#xff1a; torch.save(net.state_dict()) 加载参数&#xff08;加载参数前需要先实例化模型&#xff09;&#xff1a; param torch.load(param.pth) net.load_…

2023最新版本Activiti7系列-身份服务

身份服务 在流程定义中在任务结点的 assignee 固定设置任务负责人&#xff0c;在流程定义时将参与者固定设置在.bpmn 文件中&#xff0c;如果临时任务负责人变更则需要修改流程定义&#xff0c;系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组&#xff0c;可…

vue-next-admin vue3.x版本,table自定义

vue3.x版本&#xff0c;将table进行了封装。使用起来更方便了。但是&#xff0c;有时候我们需要将一组信息显示到一列中。所以我将其进行了简单的二次改造。支持table-column自定义。 table改造代码 <template><div class"table-container"><el-tabl…

【Ajax】笔记-POST请求(原生)

POST请求 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>AJAX POST 请求</title><…

VScode——NPM脚本窗口找不到

一、问题描述&#xff08;NPM终端在任务栏左侧找不到&#xff09; VScode&#xff08;Visual Studio Code&#xff09;版本&#xff1a;1.79.2 二、解决办法 第一步&#xff1a;通过设置/用户设置/扩展/MPM更改NPM默认配置&#xff0c;如下图所示&#xff1a; 第二步&#xff…

springboot实现全局异常捕获

导言&#xff1a; 为什么要做异常处理&#xff1a; 原因有三&#xff1a; 1、将系统产生的全部异常统一捕获处理。 2、自定义异常需要由全局异常来捕获。 3、JSR303规范的validator参数校验器、参数校验不通过、本身无法使用try…catch 其实对于前后端分离的项目做异常处理…