【设计模式】Java设计模式-享元模式

Java设计模式 – 享元模式

😄 不断学习才是王道
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆原创作品,更多关注我CSDN: 一个有梦有戏的人
👊准备将博客园、CSDN一起记录分享自己的学习心得!!!
🌝分享学习心得,欢迎指正,大家一起学习成长!

【设计模式】Java设计模式-享元模式

简介

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

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
———— 菜鸟联盟
UML图:

【设计模式】Java设计模式-享元模式

主要角色

1.抽象享元角色(Flyweight)

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

2.具体享元角色(ConcreteFlyweight)

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

3.不可同享角色(UnConcreteFlyweight)

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

4.享元工厂(FlyweightFactory)

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

内部状态和外部状态

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

实例

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

【设计模式】Java设计模式-享元模式

①、抽象类的定义

只有一个借书的方法

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 pool = new HashMap();
    // 如果有书籍就放入缓存
    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设计模式-享元模式

好文推荐

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

Original: https://www.cnblogs.com/lyd-code/p/16699528.html
Author: 怒放吧德德
Title: 【设计模式】Java设计模式-享元模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619735/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 我的第一篇博客-Markdown基本语法

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/lihui-qianying/p/lihui.htmlA…

    Java 2023年6月14日
    092
  • MarkDown 简要语法学习

    MarkDown 简要语法学习 标题 +空格显示标题 多个#代表不同级别标题 ,最多不超过6级。 字体 粗体 ** 斜体 * 粗斜体 *** 删除 ~~ 下划线 引用 一个大于号 …

    Java 2023年6月9日
    077
  • Java代码中System.currentTimeMillis()方法具有什么功能呢?

    转自:http://java265.com/JavaCourse/202111/1749.html 下文笔者讲述System.currentTimeMillis()方法的具体功能,…

    Java 2023年6月15日
    097
  • 网络编程

    网络编程 网络的概念 网络通信 1.概念:两台设备之间通过网络实现数据传输; 2.网络通信:将数据通过网络从一台设备传输到另一台设备 3.java.net包下提供了一系列的类或接口…

    Java 2023年6月5日
    0102
  • PLSQ执行同样的sql,使用mybatis进行动态拼装执行的时候非常慢的问题解决

    如题,项目中碰到了同样的sql,在plsql中执行很快,几乎秒出,但在程序中使用mybatis框架时,却非常的慢,前提是动态拼装的sql。在使用写死的参数,不会出现很慢的效果。最后…

    Java 2023年6月8日
    086
  • java中String、StringBuffer、StringBuilder的区别

    String类中使用字符数组保存字符串,如下就是,因为有”final”修饰符,所以可以知道string对象是不可变的。 private final char…

    Java 2023年5月29日
    082
  • Java设计模式之(十二)——观察者模式

    1、什么是观察者模式? Define a one-to-many dependency between objects so that when one object change…

    Java 2023年5月29日
    097
  • 普通module如何使用@Test测试

    问题 对于一个 maven工程来说,使用@Test注解来测试只需要在 pom.xml中引入test的依赖即可。但是对于一个普通的 module那又怎么使用呢? 最方便的就是 alt…

    Java 2023年6月7日
    095
  • 如何跳出页面的Frame框架

    很多网页都是框架结构的,在很多的情况下会通过按钮点击事件或链接,跳出框架转到其它界面。 使用的过程中会经常遇到跳不出框架的问题。 例如,修改个人密码的时候,当密码修改成功以后,需要…

    Java 2023年6月5日
    0107
  • AdoptOpenJDK(JAVA环境)安装

    检测是否存在JDK 接下来可以将 java 开头的安装包均卸载即可 下载JDK 解压完之后, /opt/module/ ⽬录中会出现⼀个 jdk8u252-b09的⽬录 配置JDK…

    Java 2023年5月29日
    077
  • day41-网络编程03

    Java网络编程03 5.UDP网络通信编程[了解] 5.1基本介绍 类 DatagramSocket和 DatagramPacket[数&#x636…

    Java 2023年6月15日
    081
  • SpringBoot快速入门

    编写业务代码, Controller package com.andan.web.controller; import org.springframework.web.bind.a…

    Java 2023年6月16日
    082
  • spring boot 发邮件

    Spring Boot 提供了一个发送邮件的简单抽象,使用的是 org.springframework.mail.javamail.JavaMailSender 1.添加依赖 or…

    Java 2023年5月30日
    067
  • Scala中for循环的使用

    Scala中的for循环: 一.第一种实现方式:(生成器表达方式) 二.使用until生成1到10范围内的数据,包左包右(相当于10-1) 三.在第一种实现方式的基础上加上步长限制…

    Java 2023年6月9日
    064
  • 异常

    异常的处理方式: 1.JVM处理 JVM处理异常的过程: ​ 1).打印异常的信息 2).显示出异常的位置 3.)停止了程序 2.自己处理 try{}catch{}finally{…

    Java 2023年6月8日
    0129
  • SpringFramework 应用接入 Apollo 配置中心

    环境: SpringFramework:4.3.5.RELEASE apollo-client:1.5.1 1.在项目的 resources/META-INF/ 目录下添加 app…

    Java 2023年5月30日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球