享元模式模式简介

news/2025/3/6 3:31:46/

概念

享元模式(Flyweight pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用和提高性能。它通过将对象的状态分为可共享的内部状态和不可共享的外部状态,来实现对象的共享。内部状态可以被多个对象共享,而外部状态则取决于具体的对象。通过共享内部状态,可以减少系统中相似对象的数量,从而节省内存空间。

特点

  1. 减少内存占用:通过共享内部状态,减少了相似对象的数量,降低了内存占用。
  2. 提高性能:减少了创建相似对象的开销,提高了系统的性能。
  3. 分离内部状态和外部状态:内部状态可以共享,外部状态是独立的,客户端可以自行设置。

优点

  1. 减少内存占用:通过共享内部状态,减少了相似对象的数量,降低了内存占用。
  2. 提高性能:减少了创建相似对象的开销,提高了系统的性能。
  3. 简化对象结构:通过将状态分离,简化了对象的结构,使得对象更加轻量级。

缺点

  1. 对象共享可能导致线程安全问题:如果多个线程同时访问共享对象,并修改了外部状态,可能会导致线程安全问题。
  2. 增加了代码复杂性:为了实现对象的共享和分离状态,需要引入额外的逻辑,增加了代码的复杂性。

适用场景

  1. 对象数量庞大且相似:当系统中存在大量相似的对象,并且这些对象的区别仅在于它们的内部状态时,可以考虑使用享元模式。
  2. 需要缓存对象的应用:当需要缓存对象以提高性能时,可以使用享元模式来共享对象。

实现方式

  1. 内部状态和外部状态分离:将对象的状态分为内部状态和外部状态,内部状态可以共享,外部状态是独立的。
  2. 对象池:通过维护一个对象池来管理可共享的对象,客户端从对象池中获取对象,并设置外部状态。
  3. 使用工厂模式:可以结合工厂模式来创建享元对象,工厂负责管理对象的共享和创建。

实现代码:

import java.util.HashMap;
import java.util.Map;// 抽象享元接口
interface Flyweight {void operation(String extrinsicState);
}
// 具体享元类
class ConcreteFlyweight implements Flyweight {private String intrinsicState;public ConcreteFlyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}public void operation(String extrinsicState) {System.out.println("Intrinsic State: " + intrinsicState);System.out.println("Extrinsic State: " + extrinsicState);// 执行具体操作}
}// 享元工厂类
class FlyweightFactory {private Map<String, Flyweight> flyweights = new HashMap<>();public Flyweight getFlyweight(String key) {if (flyweights.containsKey(key)) {return flyweights.get(key);} else {Flyweight flyweight = new ConcreteFlyweight(key);flyweights.put(key, flyweight);return flyweight;}}
}public class Main {public static void main(String[] args) {FlyweightFactory factory = new FlyweightFactory();// 获取享元对象Flyweight flyweight1 = factory.getFlyweight("key1");Flyweight flyweight2 = factory.getFlyweight("key1");// 调用享元对象的操作方法,传入外部状态flyweight1.operation("state1");flyweight2.operation("state2");}}

在这个简单的示例代码中,我们创建了一个具体享元类ConcreteFlyweight,它包含了内部状态intrinsicStateFlyweightFactory是享元工厂类,它维护了一个享元对象的池,并通过getFlyweight方法返回具体的享元对象。内部状态在具体享元对象内部管理,而外部状态由客户端传入。

客户端代码中,首先通过工厂类获取两个享元对象flyweight1flyweight2,他们共享了同一个享元对象,然后分别调用它们的operation方法,传入外部状态。从而实现了共享内部状态,同时处理各自的外部状态。


http://www.ppmy.cn/news/1117420.html

相关文章

【日常业务开发】Java实现异步编程

【日常业务开发】Java实现异步编程 Java实现异步编程什么是异步异步的八种实现方式异步编程线程异步Future异步CompletableFuture实现异步Spring的Async异步Spring ApplicationEvent事件实现异步消息队列ThreadUtil异步工具类Guava异步 CompletableFuture异步编排工具类创建异步…

03贪心:摆动序列

03贪心&#xff1a;摆动序列 376. 摆动序列 局部最优&#xff1a;删除单调坡度上的节点&#xff08;不包括单调坡度两端的节点&#xff09;&#xff0c;那么这个坡度就可以有两个局部峰值。 整体最优&#xff1a;整个序列有最多的局部峰值&#xff0c;从而达到最长摆动序列。…

bootstrap table export的使用,bootstrap table表格前端导出

第一步&#xff1a;html页面导入2个JS文件 1.依赖文件tableExport.js&#xff0c;该文件的内容如下&#xff1a; use strict;(function ($) {$.fn.tableExport function (options) {let docData;const defaults {csvEnclosure: ",csvSeparator: ,,csvUseBOM: true,dat…

【Node.js】数据库配置与操作、Session实现原理、JWT实现原理:

文章目录 一、数据库配置与操作【1】 数据库的基本操作【2】 使用 mysql 模块操作 MySQL 数据库 二、Session实现原理【1】HTTP 协议的无状态性【2】Cookie【3】Session 的工作原理【3】在 Express 中使用 Session 认证 三、JWT实现原理【1】JWT 的工作原理【2】JWT 的组成部分…

HTTPS 证书生成脚本详细讲解

前言 HTTPS证书的作用是用于保障网站的安全性。在HTTPS协议中&#xff0c;通过使用证书来实现客户端与服务器之间的认证和数据加密&#xff0c;防止中间人攻击、信息泄漏等安全问题的发生。https证书也就是SSL证书&#xff0c;我们首先要确定好需要 https 安全连接的域名&…

会员管理系统H5-02会员充值

上一篇我们讲解了移动端开卡的业务&#xff0c;会员卡开通后下一个业务就是充值。充值的逻辑我们已经在PC端实现过&#xff0c;本篇我们沿用PC端的逻辑&#xff0c;在充值的时候新加一个业务积分。 1 数据源添加 给会员充值的时候&#xff0c;我们按照同等额度赠送会员相应的…

365天搞定八股文——Day 002 内核态和用户态的区别

什么是内核态和用户态 为了避免操作系统和关键数据被用户程序破坏&#xff0c;将处理器的执行状态分为内核态和用户态。 内核态是操作系统管理程序执行时所处的状态&#xff0c;能够执行包含特权指令在内的一切指令&#xff0c;能够访问系统内所有的存储空间。 用户态是用户…

Java下打印九九乘法表

这个算法是基于打直角三角型演变而来&#xff0c;代码如下&#xff1a; public class MyWork {public static void main(String[] args) {for (int i 1; i < 10; i) {for (int j 1; j < i; j) {System.out.print(j "x" i "" i*j "\t&qu…