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. 基于NCF的多模块协同实例

    简介 这次给大家带来的内容是基于NCF的多模块协同实例 主要讲解的内容是NCF的模块Xncf之间相互调用,相互协作的能力 这里可以把Xncf比作乐高玩具,一个Xncf就是你拥有的乐高玩具的类型,比如你 ...

  2. 数据孤岛下的新破局 Real Time DaaS:面向 AP+TP 业务的数据平台架构

    从传统数仓,到大数据平台,再到数据中台和湖仓一体新数据平台,在日益加重的数据孤岛困扰下,面向AP场景的解决方案可谓浩如烟海.但实际上,企业在TP类型业务上的投入和AP的比率却高达9:1,为什么没有为T ...

  3. eclipse使用小记录

    (手动狗头)之前用eclipse的时候左侧的project栏不知道为什么整没了....记录一下 1.击Window--how View--other 2.Project Explorer,就可以了

  4. 面试突击65:为什么要用HTTPS?它有什么优点?

    说到 HTTPS 相信大部分人都是不陌生,因为目前我们使用的绝大数网站都是基于 HTTPS 的,比如以下这些: 那么问题来了,他们为什么要使用 HTTPS 呢?HTTPS 有哪些过人之处呢? 1.HT ...

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

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

  6. (一)java基础篇-----认识java

    1.简单介绍java起源: 1995年,詹姆斯-高斯林在sun公司开发出java编程语言.到2010年,sun公司被Oracle公司收购,而詹姆斯-高斯林也离开了Oracle公司.所以,如今想要安转j ...

  7. ExceptionLess的安装、配置、使用

    前言 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web API,Web Forms,WPF,Console,ASP.NET ...

  8. 使用Python3.7配合协同过滤算法(base on user,基于人)构建一套简单的精准推荐系统(个性化推荐)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_136 时至2020年,个性化推荐可谓风生水起,Youtube,Netflix,甚至于Pornhub,这些在互联网上叱咤风云的流媒体 ...

  9. 为你的网站加上live2d的动态小挂件,博君一晒

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_122 喜欢二次元的朋友一定对大名鼎鼎的live2d技术并不陌生,live2D是一种应用于电子游戏的绘图渲染技术,技术由日本Cybe ...

  10. 巧用Prometheus来扩展kubernetes调度器

    Overview 本文将深入讲解 如何扩展 Kubernetes scheduler 中各个扩展点如何使用,与扩展scheduler的原理,这些是作为扩展 scheduler 的所需的知识点.最后会完 ...