Java设计模式 - 享元模式

不断学习才是王道

继续踏上学习之路,学之分享笔记

总有一天我也能像各位大佬一样

原创作品,更多关注我CSDN: 一个有梦有戏的人

准备将博客园、CSDN一起记录分享自己的学习心得!!!

分享学习心得,欢迎指正,大家一起学习成长!

简介

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

                                                                                                                                                    ———— 菜鸟联盟

UML图:

主要角色

1.抽象享元角色(Flyweight)

享元对象抽象基类或者接口,同时定义出对象的外部状态和内部状态的接口或实现。

2.具体享元角色(ConcreteFlyweight)

实现抽象角色定义的业务。该角色的内部状态处理应该与环境无关,不能出现会有一个操作改变内部状态,同时修改了外部状态。

3.不可同享角色(UnConcreteFlyweight)

一般不会出现在享元工厂中

4.享元工厂(FlyweightFactory)

负责管理享元对象池和创建享元对象,提供容器池,同时提供获取对象方法。

内部状态和外部状态

  • 享元模式提供了两个要求:细粒度和共享对象。
  • 外部状态:对象得以依赖的一个标记,是随着环境的变换而变化,不可共享的状态。
  • 内部状态:对象共享出来的信息,存在享元对象内部且不会随着环境的变化而变化。

实例

本次采用图书馆借书的案例来理解享元模式,形式很简单,首先定义一个抽象类,里面有个抽象方法,接着定义子类来继承抽象类,并实现其方法。为了模拟外部状态,还需定义一个用户实体类。构建工厂来作为池存放对象,并暴露获取对象的方法。最后通过调用方法。

类图:

①、抽象类的定义

只有一个借书的方法

package com.lyd.demo.flyweight;
import com.lyd.demo.entity.User;
/**
* @Author: lyd
* @Description: 图书馆 - 抽象类
* @Date: 2022-09-01
*/
public abstract class Library {
public abstract void borrow(User user); // 抽象方法 - 借书
}

②、抽象类的子类

实现抽象方法

package com.lyd.demo.flyweight;
import com.lyd.demo.entity.User;
/**
* @Author: lyd
* @Description: 具体子类
* @Date: 2022-09-01
*/
public class LibraryImpl extends Library {
private String name; // 书名 - 内部状态
public LibraryImpl(String name) {
this.name = name;
}
@Override
public void borrow(User user) {
System.out.println("图书馆的书《" + name + "》已被[" + user.getName() + "]借出");
}
}

③、外部状态 - User实体类

package com.lyd.demo.entity;
/**
* @Author: lyd
* @Description: 实体 - user - 模拟 外部状态
* @Date: 2022-09-01
*/
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

④、工厂类

用Map集合来充当缓冲池,存放对象,并且提供获取对象的方法,为了方便观察享元模式的作用,还有个获取对象池中对象数量。

package com.lyd.demo.factory;
import com.lyd.demo.flyweight.Library;
import com.lyd.demo.flyweight.LibraryImpl;
import java.util.HashMap;
/**
* @Author: lyd
* @Description: 工厂类
* @Date: 2022-09-01
*/
public class LibraryFactory {
// 用集合来充当缓存池,暂存书籍
private HashMap<String, LibraryImpl> pool = new HashMap<String, LibraryImpl>();
// 如果有书籍就放入缓存
public Library getLibraryImpl(String name) {
if (!pool.containsKey(name)) {
// 创建一个放入
pool.put(name, new LibraryImpl(name));
}
return pool.get(name);
}
// 获取书籍个数
public int bookCount() {
return pool.size();
}
}

⑤、测试

通过工厂类调用获得对象,再去调用借书方法,采用两种不用角色和不同数据来演绎享元模式的案例实现。

package com.lyd.demo.test;

import com.lyd.demo.entity.User;
import com.lyd.demo.factory.LibraryFactory;
import com.lyd.demo.flyweight.Library; /**
* @Author: lyd
* @Description: 测试类
* @Date: 2022-09-01
*/
public class FlyWeightTest {
public static void main(String[] args) {
// 创建工厂
LibraryFactory libraryFactory = new LibraryFactory();
Library book = libraryFactory.getLibraryImpl("Java设计模式");
book.borrow(new User("怒放吧德德")); // 假设书已经归还 Library book2 = libraryFactory.getLibraryImpl("Java设计模式");
book2.borrow(new User("愤怒吧德德")); Library book3 = libraryFactory.getLibraryImpl("Go语言编程");
book3.borrow(new User("怒放吧德德")); System.out.println("现在有书:" + libraryFactory.bookCount() + " 本");
}
}

运行结果:

好文推荐

创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!

【设计模式】Java设计模式 - 享元模式的更多相关文章

  1. Java设计模式之《享元模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...

  2. Java设计模式学习记录-享元模式

    前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...

  3. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员‍‍的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...

  4. 【转】Java设计模式之《享元模式》及应用场景

    享元模式:“享”就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在. 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用.这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我 ...

  5. java设计模式-----10、享元模式

    Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使 ...

  6. Java描述设计模式(18):享元模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.使用场景 应用代码 public class C01_InScene { public static void main(String[] ...

  7. 《JAVA设计模式》之享元模式(Flyweight)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是 ...

  8. Java设计模式:Flyweight(享元)模式

    概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...

  9. 设计模式学习心得<享元模式 Flyweight>

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...

  10. 设计模式(11)--Flyweight(享元模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ...

随机推荐

  1. Redis开机自启

    添加开机启动服务 vi /etc/systemd/system/redis.service 在redis.service中输入以下内容 ps:ExecStart配置成自己的路径 [Unit] Desc ...

  2. gnet: 一个轻量级且高性能的 Go 网络框架 使用笔记

    一个偶然的机会接触到了golang,被它的高并发传说所吸引,就开始学这门语言,越学感觉越有意思^_^ 注册了博客园这么多年,第一次写东西,年纪大了,脑子不好使了,就得写下来,记下来,为了自己以后查阅, ...

  3. Java学习dayo4

    分支结构和循环语句 1.包的概念 包就是文件夹 包的命名规范:全小写,域名倒置,不能以点开头或结尾,可以包含点,每存在一个点表示一个子目录 举例:com.baidu.demo 定义包后,包中的java ...

  4. Linux环境下ProxyChains应用网络代理

    1.下载源码 git clone https://github.com.cnpmjs.org/rofl0r/proxychains-ng.git 或者 https://hub.fastgit.org/ ...

  5. 乐观锁和悲观锁在kubernetes中的应用

    数据竞争和竞态条件 Go并发中有两个重要的概念:数据竞争(data race)和竞争条件(race condition).在并发程序中,竞争问题可能是程序面临的最难也是最不容易发现的错误之一. 当有两 ...

  6. [Linux] 如何在 Linux 电脑上制作专业的视频教程

    目录 前言 1.软件工具准备 a. 录音软件 b. 录屏软件 c. 摄像头软件 d. 安卓屏幕操作软件 e. 视频剪辑软件 2.视频教程制作 3.效果 参考链接 前言 博主使用 Arch Linux ...

  7. PLC转OPC UA的协议转换网关需要多少钱呢?

    嵌入式OPC UA网关BL102简化了OPC UA程序的开发与IIOT工业物联网应用 在制造业数字化升级过程中,我们碰到最多的工作便是针对每一款PLC去开发一套OPC UA程序,然后通过这套程序去读取 ...

  8. GIt后悔药:还原提交的操作(谨慎操作)

    一.背景: 偶尔会遇到git的版本分支的文件被误改的情况,需要还原,此篇文章可能会帮助到你. PS: 来理解下 Git 工作区.暂存区和版本库概念,可以更好的理解以下的还原操作. * 工作区:就是你在 ...

  9. node.js操作数据库

    var sys = require('sys'); var Client = require('mysql').Client; var client = new Client(); client.us ...

  10. Spring mvc源码分析系列--前言

    Spring mvc源码分析系列--前言 前言 距离上次写文章已经过去接近两个月了,Spring mvc系列其实一直都想写,但是却不知道如何下笔,原因有如下几点: 现在项目开发前后端分离的趋势不可阻挡 ...